﻿/******************************************************************************
 * * ui_common.c - implementation of ui common functions
 *
 * *(C) Copyright 2019 Asr International Ltd.
 * * All Rights Reserved
 * ******************************************************************************/
/*********************
*      INCLUDES
*********************/
#include <stdio.h>
#include <stdlib.h>
#include "inter_common_ui_interface.h"
#include "ui_lang.h"
#include "lvgl/src/lv_hal/lv_hal_indev.h"
#include "lv_drv_conf.h"
#ifdef UI_COMMON_DUMMY  // on PC
#include "lv_drivers/indev/keyboard.h"
#else // on crane_evb
#include "lv_drivers/indev/crane_evb_keypad.h"
#endif
#include "lvgl/hal/hal.h"
#include "ui_log.h"
#include "ui_ime.h"
#include "modem/mmi_modemadp_interface.h"
#include "inter_setting_interface.h"
#include "inter_audio_player_interface.h"
#include "inter_framework_interface.h"
#include "inter_call_framework_interface.h"
#include "inter_call_setting_interface.h"
#include "nav.h"
#include "inter_interphone_interface.h"

/*********************
*      DEFINES
*********************/
extern lv_style_t roller_unfocus_style;
extern lv_indev_t *keypad_dev;               // keypad_dev from crane/prodect/board_evb.c

/**********************
*      TYPEDEFS
**********************/
typedef struct
{
    lv_obj_t   *RefObj;
    lv_align_t Align;
    INT16      x;
    INT16      y;
} UI_ObjAlign_Info_t;

typedef enum
{
    UI_GROUP_TYPE_NONE     = 0x00,
    UI_GROUP_TYPE_ROLLER   = 0x01, /**/
    UI_GROUP_TYPE_LIST     = 0x08, /*Normal list*/
    UI_GROUP_TYPE_LIST_TA  = 0x0A, /*Containerlist with ta*/
    UI_GROUP_TYPE_LIST_BAR = 0x0C, /*Containerlist with bar*/
    UI_GROUP_TYPE_CALENDAR = 0x10, /*Calendar*/
} UI_GROUP_TYPE;

typedef struct
{
    lv_obj_t       *GroupObj;
    lv_signal_cb_t Old_Signal_Func;
    UI_GROUP_TYPE  GroupType;
} UI_Obj_Signal_Func_t;

/**********************
*  STATIC PROTOTYPES
**********************/
static VOID UI_Normal_ButtonBar_Create(UI_Button_Bar_Desc_t *ButtonBar, lv_obj_t *Parent);
static VOID UI_Normal_Group_Create(lv_obj_t *Obj1, lv_obj_t *Obj2, lv_obj_t *Obj3);
static VOID UI_Normal_KeyFunc_Set(UI_Handle_Key_CallBack *KeyFunc);
static VOID UI_Normal_Current_Win_Set(lv_obj_t *Win);
static VOID UI_Normal_Set_Focused_Obj(lv_group_t *group);
static VOID UI_Normal_Set_BtnPress_Effect(UI_KEY_STATUS KeySta, UI_KEY_VALUE KeyData);
static lv_res_t UI_Normal_Roller_Signal(struct _lv_obj_t *obj, lv_signal_t sign, void *param);
static lv_res_t UI_Normal_Set_ItemBar_Value(UI_KEY_VALUE KeyData);
static lv_obj_t *UI_Normal_Win_Create(BOOL IsTitBar, UI_Label_Desc_t *TitleBar);
static lv_obj_t *UI_Normal_ContList_Add(lv_obj_t *List,UI_Container_Base_Desc_t *NormalContBaseDesc,
    UINT8 SelIndex);
static lv_obj_t *UI_Normal_BtnContList_Add(lv_obj_t *List, UI_Button_Desc_t Button,
    lv_coord_t BtnHeight);
static lv_obj_t *UI_Normal_Label_Create(lv_obj_t *Parent, UI_Label_Desc_t *LabelDesc, UINT16 Width,
    UINT16 Hight, UI_ObjAlign_Info_t *AlignInfo);
static lv_res_t UI_Normal_New_Signal_Func(struct _lv_obj_t *obj, lv_signal_t sign, VOID *param);
static lv_res_t UI_Normal_List_Signal(lv_obj_t *List, UI_KEY_VALUE KeyData);
static lv_res_t UI_Normal_Calendar_Signal(lv_obj_t *Cale, UI_KEY_VALUE KeyData);
static UINT8 UI_Normal_Get_Month_Length(INT32 year, INT32 month);
static VOID UI_Normal_List_Set_Btn_Selected(lv_obj_t *list, lv_obj_t *btn);

/**********************
*  STATIC VARIABLES
**********************/
static UI_Handle_Key_CallBack        *Key_Func;
static UI_List_Btn_Selected_CallBack *Btn_Sel_Func;

static lv_group_t                    *Group;
static lv_obj_t                      *UI_Normal_Current_Win;
static lv_obj_t                      *UI_Normal_Last_Win;
static lv_theme_t                    *Simple_Theme;
static UI_Obj_Signal_Func_t          FocusedObj_Signal_Func;
static lv_obj_t                      *BtnBar_Left, *BtnBar_Mid, *BtnBar_Right;
static lv_indev_t                    *KeyIndev;
static BOOL                          WakeupWithKey;

/**********************
* Global VARIABLES
**********************/
const INT8 *CaleDays[7] = { "日", "一", "二", "三", "四", "五", "六" };

/**********************
*      MACROS
**********************/

/**********************
*   STATIC FUNCTIONS
**********************/
/**
 * Create ButtonBar
 * param (in) : UI_Button_Bar_Desc_t *
 * return  VOID
 */
static VOID UI_Normal_ButtonBar_Create(UI_Button_Bar_Desc_t *ButtonBar, lv_obj_t *Parent)
{
    lv_obj_t *ButtonCont = lv_cont_create(Parent, NULL);

    lv_obj_set_size(ButtonCont, FP_HOR_RES, FP_BUTTON_BAR_H);
    lv_obj_set_pos(ButtonCont, 0, lv_obj_get_height(Parent) - FP_BUTTON_BAR_H);

    if (ButtonBar->ButtonL.Valid)
    {
        ButtonBar->ButtonL.Button = lv_btn_create(ButtonCont, NULL);
        lv_obj_set_style_local_pad_left(ButtonBar->ButtonL.Button, LV_BTN_PART_MAIN,
                                        LV_STATE_DEFAULT, 3);
        lv_obj_set_style_local_pad_right(ButtonBar->ButtonL.Button, LV_BTN_PART_MAIN,
                                         LV_STATE_DEFAULT, 0);
        lv_obj_set_size(ButtonBar->ButtonL.Button, FP_BUTTON_BAR_W, FP_BUTTON_BAR_H);
        lv_btn_set_layout(ButtonBar->ButtonL.Button, LV_LAYOUT_COLUMN_LEFT);
        lv_obj_align(ButtonBar->ButtonL.Button, NULL, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0);
        lv_obj_t *LabelLeft = lv_label_create(ButtonBar->ButtonL.Button, NULL);
        lv_obj_set_style_local_pad_right(LabelLeft, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, 0);
        lv_label_set_text_id(LabelLeft, ButtonBar->ButtonL.TxtId);
        BtnBar_Left = ButtonBar->ButtonL.Button;
    }

    if (ButtonBar->ButtonM.Valid)
    {
        ButtonBar->ButtonM.Button = lv_btn_create(ButtonCont, NULL);
        lv_obj_set_style_local_pad_left(ButtonBar->ButtonM.Button, LV_BTN_PART_MAIN,
                                        LV_STATE_DEFAULT, 0);
        lv_obj_set_style_local_pad_right(ButtonBar->ButtonM.Button, LV_BTN_PART_MAIN,
                                         LV_STATE_DEFAULT, 0);
        lv_obj_set_size(ButtonBar->ButtonM.Button, FP_BUTTON_BAR_W, FP_BUTTON_BAR_H);
        lv_btn_set_layout(ButtonBar->ButtonM.Button, LV_LAYOUT_COLUMN_MID);
        lv_obj_align(ButtonBar->ButtonM.Button, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, 0);
        lv_obj_t *LabelMid = lv_label_create(ButtonBar->ButtonM.Button, NULL);
        lv_label_set_text_id(LabelMid, ButtonBar->ButtonM.TxtId);
        BtnBar_Mid = ButtonBar->ButtonM.Button;
    }

    if (ButtonBar->ButtonR.Valid)
    {
        ButtonBar->ButtonR.Button = lv_btn_create(ButtonCont, NULL);
        lv_obj_set_style_local_pad_left(ButtonBar->ButtonR.Button, LV_BTN_PART_MAIN,
                                        LV_STATE_DEFAULT, 0);
        lv_obj_set_style_local_pad_right(ButtonBar->ButtonR.Button, LV_BTN_PART_MAIN,
                                         LV_STATE_DEFAULT, 3);
        lv_obj_set_size(ButtonBar->ButtonR.Button, FP_BUTTON_BAR_W, FP_BUTTON_BAR_H);
        lv_btn_set_layout(ButtonBar->ButtonR.Button, LV_LAYOUT_COLUMN_RIGHT);
        lv_obj_align(ButtonBar->ButtonR.Button, NULL, LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0);
        lv_obj_t *LabelRight = lv_label_create(ButtonBar->ButtonR.Button, NULL);
        lv_obj_set_style_local_pad_right(LabelRight, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, 0);
        lv_label_set_text_id(LabelRight, ButtonBar->ButtonR.TxtId);
        BtnBar_Right = ButtonBar->ButtonR.Button;
    }
} /* UI_Normal_ButtonBar_Create */


/**
 * Create Win
 * param (in) : IsTitleBar if need create titlebar
 *             TitleBar pointer of titlebar info
 * return  pointer to a object Win
 */
static lv_obj_t *UI_Normal_Win_Create(BOOL IsTitBar, UI_Label_Desc_t *TitleBar)
{
    lv_obj_t *Win = lv_win_create(FP_PARENT, NULL);
    lv_win_set_title(Win, "");
    lv_win_set_header_height(Win, 0);
    lv_win_set_btn_width(Win, 0);
    lv_obj_set_size(Win, FP_HOR_RES, FP_WIN_H);
    lv_obj_set_pos(Win, 0, FP_STATUS_BAR_H);
    lv_win_set_scrollbar_mode(Win, LV_SCROLLBAR_MODE_HIDE);

    if (IsTitBar && TitleBar)
    {
        UI_ObjAlign_Info_t AlignInfo;
        memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t));
        AlignInfo.Align = LV_ALIGN_IN_TOP_MID;
        TitleBar->Label = UI_Normal_Label_Create(Win, TitleBar, FP_HOR_RES, FP_TITLE_BAR_H,
            &AlignInfo);
        lv_obj_add_style(TitleBar->Label, LV_LABEL_PART_MAIN, &label_prim);
    }

    UI_Normal_Current_Win_Set(Win);
    return(Win);
}


/**
 * Create Win FullScreen
 * param (in) : VOID
 * return  pointer to object Win
 */
static lv_obj_t *UI_Normal_FullScreen_Win_Create(VOID)
{
    lv_obj_t *Win = lv_win_create(FP_PARENT, NULL);
    lv_win_set_title(Win, "");
    lv_win_set_header_height(Win, 0);
    lv_win_set_btn_width(Win, 0);
    lv_obj_set_size(Win, FP_HOR_RES, FP_VER_RES);
    lv_obj_set_pos(Win, 0, 0);
    lv_win_set_scrollbar_mode(Win, LV_SCROLLBAR_MODE_HIDE);

    UI_Normal_Current_Win_Set(Win);
    return(Win);
}


/**
 * Create Label Object
 * param (in) : Parent pointer to a parent obj
 *             UI_Label_Desc_t struct to a label
 *             Width,Height,
 *             pointer to aligninfo
 * return  pointer to a object Label
 */
static lv_obj_t *UI_Normal_Label_Create(lv_obj_t *Parent, UI_Label_Desc_t *LabelDesc, UINT16 Width,
    UINT16 Height, UI_ObjAlign_Info_t *AlignInfo)
{
    INT8     *LabelTxt = NULL;
    lv_obj_t *Label;
    lv_obj_t *Cont;
    lv_obj_t *Img;

    if (LabelDesc->ImgSrc)
    {
        Cont = lv_cont_create(Parent, NULL);
        lv_cont_set_layout(Cont, LV_LAYOUT_OFF);
        lv_obj_set_style_local_bg_opa(Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_0);
        Img = lv_img_create(Cont, NULL);
        lv_img_set_src(Img, LabelDesc->ImgSrc);
        Label = lv_label_create(Cont, NULL);
        lv_obj_add_style(Label, LV_LABEL_PART_MAIN, &label_sec);
        if (LabelDesc->TxtFont)
        {
            lv_obj_set_style_local_text_font(Label,
                                             LV_LABEL_PART_MAIN,
                                             LV_STATE_DEFAULT,
                                             LabelDesc->TxtFont);
        }
        UINT16 Label_Pad_Hor = lv_obj_get_style_pad_left(Label, LV_LABEL_PART_MAIN);
        lv_obj_set_size(Cont, Width - Label_Pad_Hor * 2, Height);
        if (AlignInfo != NULL)
        {
            lv_obj_align(Cont, AlignInfo->RefObj, AlignInfo->Align, AlignInfo->x, AlignInfo->y);
        }
        lv_obj_align(Img, Cont, LV_ALIGN_IN_TOP_LEFT, Label_Pad_Hor, 5);
        lv_obj_set_x(Label, lv_obj_get_width(Img) + Label_Pad_Hor * 2);
        lv_label_set_long_mode(Label,LV_LABEL_LONG_BREAK);
        lv_obj_set_width(Label, lv_obj_get_width(Cont) - lv_obj_get_width(Img) - Label_Pad_Hor * 2);
        lv_label_set_align(Label, LabelDesc->TxtAlign);
        if (LabelDesc->TxtId != LV_LANG_TXT_ID_NONE)
        {
            lv_label_set_text_id(Label, LabelDesc->TxtId);
        }
        else
        {
            lv_label_set_text(Label,"");
        }
        LabelDesc->Img = Img;
    }
    else
    {
        Label = lv_label_create(Parent, NULL);
        lv_obj_add_style(Label, LV_LABEL_PART_MAIN, &label_sec);
        if (LabelDesc->TxtFont)
        {
            lv_obj_set_style_local_text_font(Label,
                                             LV_LABEL_PART_MAIN,
                                             LV_STATE_DEFAULT,
                                             LabelDesc->TxtFont);
        }
        if (Width != 0 || Height != 0)
        {
            lv_label_set_long_mode(Label,LV_LABEL_LONG_BREAK);
            lv_obj_set_size(Label, Width, Height);
        }
        if (LabelDesc->TxtId != LV_LANG_TXT_ID_NONE || LabelDesc->SymbolId)
        {
            if (LabelDesc->SymbolId)
            {
                lv_label_set_align(Label, LabelDesc->SymbolAlign);
                if (LabelDesc->TxtId != LV_LANG_TXT_ID_NONE)
                {
                    LabelTxt = Hal_Mem_Alloc(strlen(lv_lang_get_text(LabelDesc->TxtId)) + 10);

                    sprintf(LabelTxt,"%s ", LabelDesc->SymbolId);
                    strcat(LabelTxt, lv_lang_get_text(LabelDesc->TxtId));
                    lv_label_set_text(Label,LabelTxt);
                }
                else
                {
                    lv_label_set_text(Label, LabelDesc->SymbolId);
                }
            }
            else
            {
                lv_label_set_align(Label, LabelDesc->TxtAlign);
                lv_label_set_text_id(Label, LabelDesc->TxtId);
            }
        }
        else
        {
            lv_label_set_align(Label, LabelDesc->TxtAlign);
            lv_label_set_text(Label,"");
        }
        if (AlignInfo != NULL)
        {
            lv_obj_align(Label, AlignInfo->RefObj, AlignInfo->Align, AlignInfo->x, AlignInfo->y);
        }
    }

    if (LabelTxt)
    {
        Hal_Mem_Free(LabelTxt);
    }

    return(Label);
} /* UI_Normal_Label_Create */


/**
 * Add the Button to a ButtonContainerList
 * param (in) : Parent pointer to list obj
 *             UI_Label_Desc_t struct to a Button
 *             lv_coord_t height of button, 0 to set fit
 * return  pointer to a object Button
 */
static lv_obj_t *UI_Normal_BtnContList_Add(lv_obj_t *List, UI_Button_Desc_t Button,
    lv_coord_t BtnHeight)
{
    /*Create a list element with the image an the text*/
    lv_obj_t *ListBtn = lv_btn_create(List, NULL);
    lv_list_set_ancestor_btn_signal(ListBtn);

    lv_obj_set_event_cb(ListBtn, Button.ReleaseFun);
    lv_page_glue_obj(ListBtn, TRUE);
    lv_btn_set_layout(ListBtn, LV_LAYOUT_ROW_MID);
    if (0 != BtnHeight)
    {
        lv_btn_set_fit(ListBtn, LV_FIT_NONE);
    }
    else
    {
        lv_btn_set_fit2(ListBtn, LV_FIT_NONE, LV_FIT_TIGHT);
    }
    lv_theme_apply(ListBtn, LV_THEME_LIST_BTN);
    lv_obj_add_protect(ListBtn, LV_PROTECT_PRESS_LOST);
    //lv_obj_set_signal_cb(ListBtn, lv_list_get_listbtn_signal());

    /*Make the size adjustment*/
    lv_coord_t ListW       = lv_obj_get_width(List);
    lv_coord_t Pad_Hor_Tot = lv_obj_get_style_pad_left(List, LV_LIST_PART_BG)
        + lv_obj_get_style_pad_left(List, LV_LIST_PART_SCROLLABLE);
    ListW -= Pad_Hor_Tot * 2;
    lv_obj_set_width(ListBtn, ListW);
    if (0 != BtnHeight)
    {
        lv_obj_set_height(ListBtn, BtnHeight);
    }

    /*create symbol1*/
    if (Button.SymbolId1)
    {
        lv_obj_t *Img1 = lv_img_create(ListBtn, NULL);
        lv_img_set_src(Img1, Button.SymbolId1);
        lv_obj_add_style(Img1, LV_IMG_PART_MAIN, &img_light);
        lv_obj_set_click(Img1, FALSE);
    }
    /*create label*/
    lv_obj_t   *Label      = NULL;
    lv_coord_t Btn_Hor_Pad = lv_obj_get_style_pad_left(ListBtn, LV_BTN_PART_MAIN);
    if (Button.BtnTxt || lv_lang_get_text(Button.TxtId))
    {
        Label = lv_label_create(ListBtn, NULL);
        if (Button.TxtId != LV_LANG_TXT_ID_NONE)
        {
            lv_label_set_text(Label,lv_lang_get_text(Button.TxtId));
        }
        else
        {
            lv_label_set_text(Label, Button.BtnTxt);
        }

        lv_obj_set_click(Label, FALSE);
        lv_label_set_long_mode(Label, LV_LABEL_LONG_SROLL);
        lv_obj_set_width(Label, ListBtn->coords.x2 - Label->coords.x1 - Btn_Hor_Pad);
    }
    /*create symbol2*/
    if (Button.SymbolId2)
    {
        lv_obj_set_width(Label, ListBtn->coords.x2 - Label->coords.x1 - Btn_Hor_Pad - ListW / 6);
        lv_obj_t *Img2 = lv_img_create(ListBtn, NULL);
        lv_img_set_src(Img2, Button.SymbolId2);
        lv_obj_add_style(Img2, LV_IMG_PART_MAIN, &img_light);
        lv_obj_set_click(Img2, FALSE);
    }

    /* If this is the first item to be added to the list and the list is
     * focussed, select it */

    lv_group_t *g = lv_obj_get_group(List);
    UINT32 ListSize = lv_list_get_size(List);
    if (ListSize == 1 && lv_group_get_focused(g) == List)
    {
        lv_list_focus_btn(List, ListBtn);
    }
    UI_Set_User_Num(ListBtn, ListSize - 1);

    return(ListBtn);
} /* UI_Normal_BtnContList_Add */


/**
 * Add the Button to a CustomContainerList
 * param (in) : Parent pointer to list obj
 *             UI_Container_Base_Desc_t* pointer to a ContBase
 * return  pointer to a object Button
 */
static lv_obj_t *UI_Normal_ContList_Add(lv_obj_t *List,
    UI_Container_Base_Desc_t                     *NormalContBaseDesc,
    UINT8                                        SelIndex)
{
    if (NormalContBaseDesc == NULL)
    {
        return(NULL);
    }

    /*Create a list element with the image an the text*/
    lv_obj_t *ListBtn = lv_btn_create(List, NULL);
    lv_list_set_ancestor_btn_signal(ListBtn);

    lv_obj_set_event_cb(ListBtn, NormalContBaseDesc->ReleaseFunc);
    lv_page_glue_obj(ListBtn, TRUE);
    lv_btn_set_fit2(ListBtn, LV_FIT_NONE, LV_FIT_TIGHT);
    lv_theme_apply(ListBtn, LV_THEME_LIST_BTN);
    lv_obj_add_protect(ListBtn, LV_PROTECT_PRESS_LOST);
    //lv_obj_set_signal_cb(ListBtn, lv_list_get_listbtn_signal());

    /*Make the size adjustment*/
    lv_coord_t ListW = lv_obj_get_width(List);
    lv_coord_t ListH = lv_obj_get_height(List);

    lv_coord_t Pad_Hor_Tot = lv_obj_get_style_pad_left(List, LV_LIST_PART_BG)
        + lv_obj_get_style_pad_left(List, LV_LIST_PART_SCROLLABLE);
    ListW -= Pad_Hor_Tot * 2;
    lv_obj_set_width(ListBtn, ListW);

    /*create item1 label*/
    lv_coord_t Btn_Hor_Pad = lv_obj_get_style_pad_left(ListBtn, LV_BTN_PART_MAIN);
    lv_obj_t *Label;
    if (NormalContBaseDesc->Label.ImgSrc)
    {
        lv_obj_t *Cont1 = lv_cont_create(ListBtn, NULL);
        lv_obj_set_style_local_bg_opa(Cont1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_0);
        lv_obj_set_size(Cont1, ListW - Btn_Hor_Pad * 2, ListH / 8);
        NormalContBaseDesc->Label.Img = lv_img_create(Cont1, NULL);
        lv_img_set_src(NormalContBaseDesc->Label.Img, NormalContBaseDesc->Label.ImgSrc);
        lv_obj_align(NormalContBaseDesc->Label.Img, Cont1, LV_ALIGN_IN_LEFT_MID, Btn_Hor_Pad, 0);
        Label = lv_label_create(Cont1, NULL);
        if (UI_BASE_OBJ_SW_ONE_ROW != NormalContBaseDesc->Choise)
        {
            lv_label_set_long_mode(Label, LV_LABEL_LONG_SROLL);
            lv_coord_t LabelW = ListW - Btn_Hor_Pad * 3
                - lv_obj_get_width(NormalContBaseDesc->Label.Img);
            lv_obj_set_width(Label, LabelW);
        }
        lv_label_set_text_id(Label,NormalContBaseDesc->Label.TxtId);
        lv_obj_align(Label, NormalContBaseDesc->Label.Img, LV_ALIGN_OUT_RIGHT_MID, Btn_Hor_Pad, 0);
    }
    else
    {
        Label = lv_label_create(ListBtn, NULL);
        if (UI_BASE_OBJ_SW_ONE_ROW != NormalContBaseDesc->Choise)
        {
            lv_label_set_long_mode(Label, LV_LABEL_LONG_SROLL);
            lv_obj_set_size(Label, ListW - Btn_Hor_Pad * 2, ListH / 8);
        }
        lv_label_set_align(Label, NormalContBaseDesc->Label.TxtAlign);
        lv_label_set_text_id(Label,NormalContBaseDesc->Label.TxtId);
    }
    NormalContBaseDesc->Label.Label = Label;

    /*create item2 based on choise*/
    switch (NormalContBaseDesc->Choise)
    {
    case UI_BASE_OBJ_LABEL:
    {
        lv_obj_t *ItemLabel = lv_label_create(ListBtn, NULL);
        lv_label_set_text_id(ItemLabel,NormalContBaseDesc->u.Label2.TxtId);
        lv_label_set_align(ItemLabel, NormalContBaseDesc->u.Label2.TxtAlign);
        lv_obj_set_click(ItemLabel, FALSE);
        lv_label_set_long_mode(ItemLabel, LV_LABEL_LONG_SROLL);
        lv_obj_set_size(ItemLabel, ListW - Btn_Hor_Pad * 4, ListH / 8);
        NormalContBaseDesc->u.Label2.Label = ItemLabel;
        break;
    }

    case UI_BASE_OBJ_BAR:
    {
        lv_obj_t *ItemBar = lv_slider_create(ListBtn, NULL);
        UI_Set_User_Num(ItemBar, 1);
        lv_coord_t PadVer = lv_obj_get_style_pad_top(ItemBar, LV_BAR_PART_BG);
        lv_obj_set_size(ItemBar, ListW - Btn_Hor_Pad * 6, ListH / 8 - PadVer * 2);
        lv_obj_set_style_local_pad_left(ItemBar, LV_BAR_PART_BG, LV_STATE_DEFAULT, 0);
        lv_obj_set_style_local_pad_right(ItemBar, LV_BAR_PART_BG, LV_STATE_DEFAULT, 0);
        lv_obj_set_style_local_pad_top(ItemBar, LV_BAR_PART_BG, LV_STATE_DEFAULT, 0);
        lv_obj_set_style_local_pad_bottom(ItemBar, LV_BAR_PART_BG, LV_STATE_DEFAULT, 0);
        lv_obj_set_style_local_bg_opa(ItemBar, LV_BAR_PART_INDIC, LV_STATE_DEFAULT, LV_OPA_COVER);
        lv_obj_set_style_local_pad_left(ItemBar, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, LV_DPI / 12);
        lv_obj_set_style_local_pad_right(ItemBar, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, LV_DPI / 12);
        lv_obj_set_style_local_pad_top(ItemBar, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, LV_DPI / 12);
        lv_obj_set_style_local_pad_bottom(ItemBar, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, LV_DPI / 12);
        lv_obj_align(ItemBar, NULL, NormalContBaseDesc->u.Bar.BarAlign, 0, 0);
        lv_slider_set_range(ItemBar, 0, NormalContBaseDesc->u.Bar.Range);
        lv_slider_set_value(ItemBar, NormalContBaseDesc->u.Bar.Value, LV_ANIM_OFF);
        NormalContBaseDesc->u.Bar.Bar    = ItemBar;
        FocusedObj_Signal_Func.GroupType = UI_GROUP_TYPE_LIST_BAR;
        break;
    }

    case UI_BASE_OBJ_IMG:
    {
        lv_obj_t *ItemImg = lv_img_create(ListBtn, NULL);
        lv_obj_set_size(ItemImg,  ListW - Btn_Hor_Pad * 4, ListH / 8);
        lv_img_set_src(ItemImg, NormalContBaseDesc->u.Img.Img);
        break;
    }

    case UI_BASE_OBJ_TA:
    {
        lv_obj_t *ItemTa = lv_textarea_create(ListBtn, NULL);
        lv_obj_set_size(ItemTa,  ListW - Btn_Hor_Pad * 4, ListH / 8);
        lv_textarea_set_one_line(ItemTa, TRUE);
        if (NormalContBaseDesc->u.Ta.TaTxt != NULL)
        {
            lv_textarea_set_text(ItemTa,(const INT8 *)NormalContBaseDesc->u.Ta.TaTxt);
        }
        lv_textarea_set_cursor_hidden(ItemTa, NormalContBaseDesc->u.Ta.TaCursorHide);
        NormalContBaseDesc->u.Ta.TextArea = ItemTa;
        FocusedObj_Signal_Func.GroupType  = UI_GROUP_TYPE_LIST_TA;
        break;
    }

    case UI_BASE_OBJ_SW:
    {
        lv_btn_set_layout(ListBtn, LV_LAYOUT_OFF);

        lv_obj_t *Cont = lv_cont_create(ListBtn, NULL);
        lv_obj_set_size(Cont, ListW / 5, ListH / 4);
        lv_obj_add_style(Cont, LV_CONT_PART_MAIN, &lv_style_transp);
        lv_obj_set_style_local_border_width(Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 2);
        lv_obj_set_style_local_border_opa(Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_0);
        lv_obj_set_style_local_border_color(Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT,
                                            LV_COLOR_MAKE(0xFF, 0xCD, 0x77));
        lv_obj_set_style_local_border_side(Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT,
                                           LV_BORDER_SIDE_FULL);
        UI_Set_User_Num(Cont, UI_BASE_OBJ_SW);
        lv_obj_t *ItemSw = lv_switch_create(Cont, NULL);
        lv_obj_set_size(ItemSw, ListW / 7, ListH / 8);
        lv_obj_set_height(Label, ListH / 3);
        lv_obj_set_style_local_radius(ItemSw, LV_SWITCH_PART_BG, LV_STATE_DEFAULT,
                                      LV_RADIUS_CIRCLE);
        lv_obj_set_style_local_pad_left(ItemSw, LV_SWITCH_PART_BG, LV_STATE_DEFAULT, 0);
        lv_obj_set_style_local_pad_right(ItemSw, LV_SWITCH_PART_BG, LV_STATE_DEFAULT, 0);
        lv_obj_set_style_local_pad_top(ItemSw, LV_SWITCH_PART_BG, LV_STATE_DEFAULT, 0);
        lv_obj_set_style_local_pad_bottom(ItemSw, LV_SWITCH_PART_BG, LV_STATE_DEFAULT, 0);
        lv_obj_set_style_local_radius(ItemSw, LV_SWITCH_PART_INDIC, LV_STATE_DEFAULT,
                                      LV_RADIUS_CIRCLE);
        lv_obj_set_style_local_bg_color(ItemSw, LV_SWITCH_PART_INDIC, LV_STATE_DEFAULT,
                                        LV_COLOR_MAKE(0xAF,0xD3,0xD8));
        lv_obj_set_style_local_bg_opa(ItemSw, LV_SWITCH_PART_INDIC, LV_STATE_DEFAULT,
                                      LV_OPA_COVER);
        lv_obj_set_style_local_pad_left(ItemSw, LV_SWITCH_PART_INDIC, LV_STATE_DEFAULT, 0);
        lv_obj_set_style_local_pad_right(ItemSw, LV_SWITCH_PART_INDIC, LV_STATE_DEFAULT, 0);
        lv_obj_set_style_local_pad_top(ItemSw, LV_SWITCH_PART_INDIC, LV_STATE_DEFAULT, 0);
        lv_obj_set_style_local_pad_bottom(ItemSw, LV_SWITCH_PART_INDIC, LV_STATE_DEFAULT, 0);
        lv_obj_set_style_local_bg_color(ItemSw, LV_SWITCH_PART_KNOB, LV_STATE_DEFAULT,
                                        LV_COLOR_MAKE(0xAF,0xD3,0xD8));
        lv_obj_set_style_local_pad_left(ItemSw, LV_SWITCH_PART_KNOB, LV_STATE_DEFAULT, 2);
        lv_obj_set_style_local_pad_right(ItemSw, LV_SWITCH_PART_KNOB, LV_STATE_DEFAULT, 2);
        lv_obj_set_style_local_pad_top(ItemSw, LV_SWITCH_PART_KNOB, LV_STATE_DEFAULT, 2);
        lv_obj_set_style_local_pad_bottom(ItemSw, LV_SWITCH_PART_KNOB, LV_STATE_DEFAULT, 2);
        lv_obj_set_style_local_radius(ItemSw, LV_SWITCH_PART_KNOB, LV_STATE_DEFAULT,
                                      LV_RADIUS_CIRCLE);
        lv_coord_t Inner = lv_obj_get_style_pad_inner(ListBtn, LV_BTN_PART_MAIN);
        lv_obj_set_width(Label, ListW - Btn_Hor_Pad * 2 - Inner - ListW / 5);
        lv_obj_align(Cont, ListBtn, LV_ALIGN_IN_RIGHT_MID, -Btn_Hor_Pad, 0);
        lv_obj_align(ItemSw, Cont, LV_ALIGN_CENTER, 0, 0);
        if (NormalContBaseDesc->u.Sw.State)
        {
            lv_switch_on(ItemSw, LV_ANIM_OFF);
        }
        else
        {
            lv_switch_off(ItemSw, LV_ANIM_OFF);
        }
        NormalContBaseDesc->u.Sw.sw = ItemSw;
        UI_Set_User_Num(ListBtn, lv_label_get_text_id(Label));
        break;
    }

    case UI_BASE_OBJ_SW_ONE_ROW:
    {
        lv_btn_set_fit2(ListBtn, LV_FIT_NONE, LV_FIT_NONE);
        lv_obj_set_height(ListBtn, ListH / 6);
        lv_btn_set_layout(ListBtn, LV_LAYOUT_OFF);
        lv_obj_align(Label, ListBtn, LV_ALIGN_IN_LEFT_MID, 10, 0);
        lv_obj_t *ItemSw = lv_switch_create(ListBtn, NULL);
        lv_obj_set_size(ItemSw, ListW / 5, ListH / 10);
        lv_obj_align(ItemSw, ListBtn, LV_ALIGN_IN_RIGHT_MID, -20, 0);
        if (NormalContBaseDesc->u.Sw.State)
        {
            lv_switch_on(ItemSw, LV_ANIM_OFF);
        }
        else
        {
            lv_switch_off(ItemSw, LV_ANIM_OFF);
        }
        NormalContBaseDesc->u.Sw.sw = ItemSw;
        UI_Set_User_Num(ListBtn, lv_label_get_text_id(Label));
        break;
    }

    case UI_BASE_OBJ_NULL:
        lv_obj_set_size(Label, ListW - Btn_Hor_Pad * 2, ListH / 4);
        break;

    default:
        break;
    } /* switch */

    if (NormalContBaseDesc->Valid == FALSE)
    {
        lv_btn_set_state(ListBtn, LV_BTN_STATE_DISABLED);
    }

    UINT32 ListSize = lv_list_get_size(List);
    if (SelIndex != 0 && SelIndex == ListSize - 1)
    {
        UI_Normal_List_Set_Btn_Selected(List, ListBtn);
    }

    /* If this is the first item to be added to the list and the list is
     * focussed, select it */
    lv_group_t *g = lv_obj_get_group(List);
    if (ListSize == 1 && lv_group_get_focused(g) == List)
    {
        UI_Normal_List_Set_Btn_Selected(List, ListBtn);
    }

    return(ListBtn);
} /* UI_Normal_ContList_Add */


/**
 * Init Key indev
 * param (in) :VOID
 * return  VOID
 */
static VOID UI_Normal_Init_KeyIndev(VOID)
{
#ifdef UI_COMMON_DUMMY   // for pc simulator
    lv_indev_drv_t KeyDrv;

    lv_indev_drv_init(&KeyDrv);
    KeyDrv.type    = LV_INDEV_TYPE_KEYPAD;
    KeyDrv.read_cb = FP_KEY_READ;
    KeyIndev       = lv_indev_drv_register(&KeyDrv);
#else  // for crane_bare
    KeyIndev = keypad_dev;
#endif
}


/**
 * Create Group
 * param (in) :obj pointer to objects needed to add a group
 * return  VOID
 */
static VOID UI_Normal_Group_Create(lv_obj_t *Obj1, lv_obj_t *Obj2, lv_obj_t *Obj3)
{
    lv_group_add_obj(Group, Obj1);
    lv_group_focus_obj(Obj1);

    if (Obj2 != NULL)
    {
        lv_group_add_obj(Group, Obj2);
    }

    if (Obj3 != NULL)
    {
        lv_group_add_obj(Group, Obj3);
    }
}


/**
 * Set ButtonBar press effect
 * param (in) :KeyState and KeyValue
 * return  VOID
 */
static VOID UI_Normal_Set_BtnPress_Effect(UI_KEY_STATUS KeySta, UI_KEY_VALUE KeyData)
{
    if (KeyData == KEY_SOFTLEFT) // KEY_SOFTLEFT
    {
        if (BtnBar_Left != NULL)
        {
            if (KeySta == KEY_PRESSED)
            {
                lv_btn_set_state(BtnBar_Left, LV_BTN_STATE_PRESSED);
            }
            else
            {
                lv_btn_set_state(BtnBar_Left, LV_BTN_STATE_RELEASED);
            }
        }
    }
    else if (KeyData == KEY_OK)
    {
        if (BtnBar_Mid != NULL)
        {
            if (KeySta == KEY_PRESSED)
            {
                lv_btn_set_state(BtnBar_Mid, LV_BTN_STATE_PRESSED);
            }
            else
            {
                lv_btn_set_state(BtnBar_Mid, LV_BTN_STATE_RELEASED);
            }
        }
    }
    else if (KeyData == KEY_SOFTRIGHT) // KEY_SOFTRIGHT
    {
        if (BtnBar_Right != NULL)
        {
            if (KeySta == KEY_PRESSED)
            {
                lv_btn_set_state(BtnBar_Right, LV_BTN_STATE_PRESSED);
            }
            else
            {
                lv_btn_set_state(BtnBar_Right, LV_BTN_STATE_RELEASED);
            }
        }
    }
} /* UI_Normal_Set_BtnPress_Effect */


/**
 * Get leap year info for a specified year value
 * param (in) tm_year:INT32
 * return BOOL: FALSE---normal year, TRUE---leap year
 */
BOOL UI_Normal_Is_Leap_Year(INT32 tm_year)
{
    BOOL LeapYearFlag = FALSE;

    if (tm_year % 400 == 0)
    {
        LeapYearFlag = TRUE;
    }
    else
    {
        if ((tm_year % 4 == 0) && (tm_year % 100 != 0))
        {
            LeapYearFlag = TRUE;
        }
    }
    return(LeapYearFlag);
}


/**
 * Get maximum number of day
 * param (in) Year: UINT32
 * param (in) Month: UINT8
 * param (out) MaxValue: UINT16 *
 * return  VOID
 */
VOID UI_Normal_Roller_Get_Max_Day(UINT32 Year, UINT8 Month, UINT16 *MaxValue)
{
    if (  (4 == Month)
       || (6 == Month)
       || (9 == Month)
       || (11 == Month))
    {
        *MaxValue = 30;
    }
    else if (2 == Month)
    {
        if (TRUE == UI_Normal_Is_Leap_Year(Year))
        {
            *MaxValue = 29;
        }
        else
        {
            *MaxValue = 28;
        }
    }
    else
    {
        *MaxValue = 31;
    }
}


/**
 * Fill options for roller
 * param (in) MidValue: UINT16
 * param (in) MaxValue: UINT16
 * param (in) MinValue: UINT16
 * param (in) OptStrLen: UINT8, 2 for month/day/hour/minute/second, 4 for year
 * return INT8 *
 */
INT8 *UI_Normal_Fill_Roller_Options(UINT16 MidValue, UINT16 MaxValue, UINT16 MinValue,
    UINT8 OptStrLen)
{
    INT8   *Ret = NULL;
    INT16  i;
    UINT16 Opt[7];

    Opt[3] = MidValue;
    for (i = 4; i < 7; i++)
    {
        if (MaxValue == Opt[i - 1])
        {
            Opt[i] = MinValue;
        }
        else
        {
            Opt[i] = Opt[i - 1] + 1;
        }
    }
    for (i = 2; i >= 0; i--)
    {
        if (MinValue == Opt[i + 1])
        {
            Opt[i] = MaxValue;
        }
        else
        {
            Opt[i] = Opt[i + 1] - 1;
        }
    }

    UINT8 Len = 7 * (OptStrLen + 1);
    Ret = (INT8 *)Hal_Mem_Alloc(Len);
    if (2 == OptStrLen)
    {
        snprintf(Ret, Len, "%02d\n%02d\n%02d\n%02d\n%02d\n%02d\n%02d",Opt[0], Opt[1], Opt[2],
            Opt[3], Opt[4], Opt[5], Opt[6]);
    }
    else if (4 == OptStrLen)
    {
        snprintf(Ret, Len, "%04d\n%04d\n%04d\n%04d\n%04d\n%04d\n%04d",Opt[0], Opt[1], Opt[2],
            Opt[3], Opt[4], Opt[5], Opt[6]);
    }

    return(Ret);
} /* UI_Normal_Fill_Roller_Options */


/**
 * Get maximum value, minimum value, text length of roller options
 * param (in) : RollerType: UI_ROLLER_TYPE
 * param (out) : MaxValue: UINT16 *
 * param (out) : MinValue: UINT16 *
 * param (out) : OptStrLen: UINT8 *
 * return  VOID
 */
static VOID UI_Normal_Roller_Get_Opt_Info(UI_ROLLER_TYPE RollerType,
    UINT16                                               *MaxValue,
    UINT16                                               *MinValue,
    UINT8                                                *OptStrLen)
{
    switch (RollerType)
    {
    case UI_ROLLER_TYPE_YEAR:
        *MaxValue  = UI_MAX_YEAR_NUM;
        *MinValue  = UI_MIN_YEAR_NUM;
        *OptStrLen = 4;
        break;

    case UI_ROLLER_TYPE_MONTH:
        *MaxValue  = 12;
        *MinValue  = 1;
        *OptStrLen = 2;
        break;

    case UI_ROLLER_TYPE_DAY:
        *MaxValue  = 31;
        *MinValue  = 1;
        *OptStrLen = 2;
        break;

    case UI_ROLLER_TYPE_HOUR:
        *MaxValue  = 23;
        *MinValue  = 0;
        *OptStrLen = 2;
        break;

    case UI_ROLLER_TYPE_MINUTE:
    case UI_ROLLER_TYPE_SECOND:
        *MaxValue  = 59;
        *MinValue  = 0;
        *OptStrLen = 2;
        break;

    default:
        /*error*/
        break;
    }
}


/**
 * Switch focused roller
 * param (in) : KeyValue
 * return  lv_res_t
 */
static lv_res_t UI_Normal_Roller_Signal(struct _lv_obj_t *obj, lv_signal_t sign, void *param)
{
    lv_obj_t *Roller = obj;
    lv_res_t res     = LV_RES_OK;

    if (sign == LV_SIGNAL_CONTROL)
    {
        if (param == NULL)
        {
            return(LV_RES_OK);
        }
        UINT32 KeyData = *(UINT32 *)param;
        if (  (KeyData == KEY_UP)
           || (KeyData == KEY_DOWN)
           || (KeyData == KEY_LEFT)
           || (KeyData == KEY_RIGHT)
           || ((KeyData >= KEY_0) && (KeyData <= KEY_9)))
        {
            printf("%s: key %d\n", __FUNCTION__, KeyData);
            UI_ROLLER_TYPE RollerType = (UI_ROLLER_TYPE)UI_Get_User_Num(Roller);
            UINT16         MaxValue;
            UINT16         MinValue;
            UINT8          OptStrLen;
            UINT16         SelValue;
            INT8           Buf[5] = { 0 };
            INT8           *Options;
            lv_obj_t       *Ta;
            lv_obj_t       *Par = lv_obj_get_parent(Roller);
            Ta = lv_obj_get_child(Par, NULL);
            while (Ta)
            {
                if (UI_Get_User_Num(Ta) == UI_ROLLER_TYPE_MAX)
                {
                    break;
                }
                Ta = lv_obj_get_child(Par, Ta);
            }

            if (KeyData == KEY_RIGHT)
            {
                lv_group_focus_next(Group);
                if (Ta == NULL)
                {
                    return(LV_RES_OK);
                }
            }
            else if (KeyData == KEY_LEFT)
            {
                lv_group_focus_prev(Group);
                if (Ta == NULL)
                {
                    return(LV_RES_OK);
                }
            }
            else if ((KeyData >= KEY_0) && (KeyData <= KEY_9))
            {
                char Digit = KeyData - KEY_0 + '0';
                if (Ta == NULL)
                {
                    Ta = lv_textarea_create(Par, NULL);
                    const lv_font_t * TextFont = lv_obj_get_style_text_font(Roller, LV_ROLLER_PART_BG);
                    lv_color_t TextColor = lv_obj_get_style_text_color(Roller, LV_ROLLER_PART_SELECTED);
                    lv_obj_add_style(Ta, LV_TEXTAREA_PART_BG, &lv_style_plain);
                    lv_obj_set_style_local_text_font(Ta, LV_TEXTAREA_PART_BG, LV_STATE_DEFAULT,
                                                     TextFont);
                    lv_obj_set_style_local_text_color(Ta, LV_TEXTAREA_PART_BG, LV_STATE_DEFAULT,
                                                      TextColor);
                    lv_obj_set_style_local_pad_top(Ta, LV_TEXTAREA_PART_BG, LV_STATE_DEFAULT, 0);
                    lv_obj_set_style_local_pad_bottom(Ta, LV_TEXTAREA_PART_BG, LV_STATE_DEFAULT, 0);
                    lv_obj_set_style_local_pad_inner(Ta, LV_TEXTAREA_PART_BG, LV_STATE_DEFAULT, 0);
                    lv_obj_add_style(Ta, LV_TEXTAREA_PART_SCROLLBAR, &lv_style_plain);
                    lv_obj_set_style_local_text_font(Ta, LV_TEXTAREA_PART_SCROLLBAR,
                                                     LV_STATE_DEFAULT, TextFont);
                    lv_obj_set_style_local_text_color(Ta, LV_TEXTAREA_PART_SCROLLBAR,
                                                      LV_STATE_DEFAULT, TextColor);
                    lv_obj_set_style_local_pad_top(Ta, LV_TEXTAREA_PART_SCROLLBAR,
                                                   LV_STATE_DEFAULT, 0);
                    lv_obj_set_style_local_pad_bottom(Ta, LV_TEXTAREA_PART_SCROLLBAR,
                                                      LV_STATE_DEFAULT, 0);
                    lv_obj_set_style_local_pad_inner(Ta, LV_TEXTAREA_PART_SCROLLBAR,
                                                     LV_STATE_DEFAULT, 0);
                    lv_obj_set_size(Ta, lv_obj_get_width(Roller), lv_font_get_line_height(TextFont));
                    lv_obj_align(Ta, Roller, LV_ALIGN_CENTER, 0, 0);
                    lv_textarea_set_cursor_hidden(Ta, TRUE);
                    lv_textarea_set_text_align(Ta, LV_LABEL_ALIGN_CENTER);
                    UI_Set_User_Num(Ta, UI_ROLLER_TYPE_MAX);
                    char Text[2] = { 0 };
                    Text[0] = Digit;
                    lv_textarea_set_text(Ta, Text);
                }
                else
                {
                    lv_textarea_add_char(Ta, Digit);
                }
            }

            UI_Normal_Roller_Get_Opt_Info(RollerType, &MaxValue, &MinValue, &OptStrLen);

            UINT16 CurValue;
            if (Ta)
            {
                const char *TaTxt = lv_textarea_get_text(Ta);
                UINT32     TxtLen = strlen(TaTxt);
                if ((KeyData >= KEY_0) && (KeyData <= KEY_9) && (TxtLen < OptStrLen))
                {
                    return(LV_RES_OK);
                }

                CurValue = atoi(TaTxt);
                if (CurValue > MaxValue)
                {
                    CurValue = MaxValue;
                }
                else if (CurValue < MinValue)
                {
                    CurValue = MinValue;
                }

                if (TxtLen == OptStrLen)
                {
                    lv_group_focus_next(Group);
                }
            }

            if (  (RollerType == UI_ROLLER_TYPE_YEAR)
               || (RollerType == UI_ROLLER_TYPE_MONTH)
               || (RollerType == UI_ROLLER_TYPE_DAY))
            {
                lv_obj_t *RollerYear  = NULL;
                lv_obj_t *RollerMonth = NULL;
                lv_obj_t *RollerDay   = NULL;
                lv_obj_t **RollerTmp  = _lv_ll_get_head(&Group->obj_ll);
                while (RollerTmp)
                {
                    if (*RollerTmp)
                    {
                        UI_ROLLER_TYPE RollerTypeTmp = (UI_ROLLER_TYPE)UI_Get_User_Num(
                            *RollerTmp);
                        if (RollerTypeTmp == UI_ROLLER_TYPE_YEAR)
                        {
                            RollerYear = *RollerTmp;
                        }
                        else if (RollerTypeTmp == UI_ROLLER_TYPE_MONTH)
                        {
                            RollerMonth = *RollerTmp;
                        }
                        else if (RollerTypeTmp == UI_ROLLER_TYPE_DAY)
                        {
                            RollerDay = *RollerTmp;
                        }
                    }
                    if (RollerYear && RollerMonth && RollerDay)
                    {
                        break;
                    }
                    RollerTmp = _lv_ll_get_next(&Group->obj_ll, RollerTmp);
                }
                lv_roller_get_selected_str(RollerYear, Buf, 5);
                UINT16 YearVal = atoi(Buf);
                lv_roller_get_selected_str(RollerMonth, Buf, 5);
                UINT8  MonVal = atoi(Buf);
                lv_roller_get_selected_str(RollerDay, Buf, 5);
                UINT8  DayVal = atoi(Buf);

                if (RollerType != UI_ROLLER_TYPE_DAY)
                {
                    if (RollerType == UI_ROLLER_TYPE_YEAR)
                    {
                        if (Ta)
                        {
                            YearVal = CurValue;
                        }
                        if (KeyData == KEY_UP)
                        {
                            if (MinValue == YearVal)
                            {
                                YearVal = MaxValue;
                            }
                            else
                            {
                                YearVal--;
                            }
                        }
                        else if (KeyData == KEY_DOWN)
                        {
                            if (MaxValue == YearVal)
                            {
                                YearVal = MinValue;
                            }
                            else
                            {
                                YearVal++;
                            }
                        }
                    }
                    else
                    {
                        if (Ta)
                        {
                            MonVal = CurValue;
                        }
                        if (KeyData == KEY_UP)
                        {
                            if (MinValue == MonVal)
                            {
                                MonVal = MaxValue;
                            }
                            else
                            {
                                MonVal--;
                            }
                        }
                        else if (KeyData == KEY_DOWN)
                        {
                            if (MaxValue == MonVal)
                            {
                                MonVal = MinValue;
                            }
                            else
                            {
                                MonVal++;
                            }
                        }
                    }

                    /*set the day if year or month is changed*/
                    UINT16 MaxValForDay;
                    UINT16 MinValForDay;
                    UINT8  OptStrLenForDay;
                    UI_Normal_Roller_Get_Opt_Info(UI_ROLLER_TYPE_DAY, &MaxValForDay, &MinValForDay,
                        &OptStrLenForDay);
                    UI_Normal_Roller_Get_Max_Day(YearVal, MonVal, &MaxValForDay);
                    if (MaxValForDay < DayVal)
                    {
                        DayVal = MaxValForDay;
                    }
                    if (  ((RollerType == UI_ROLLER_TYPE_YEAR) && (MonVal == 2))
                       || (RollerType == UI_ROLLER_TYPE_MONTH))
                    {
                        Options = UI_Normal_Fill_Roller_Options(DayVal, MaxValForDay, MinValForDay,
                            OptStrLenForDay);
                        lv_roller_set_options(RollerDay, Options, LV_ROLLER_MODE_NORMAL);
                        Hal_Mem_Free(Options);
                        lv_roller_set_selected(RollerDay, 3, FALSE);
                    }
                }
                else
                {
                    UI_Normal_Roller_Get_Max_Day(YearVal, MonVal, &MaxValue);
                }
            }

            /*move the current roller*/
            if (Ta)
            {
                SelValue = CurValue;
                lv_obj_del(Ta);
            }
            else
            {
                lv_roller_get_selected_str(Roller, Buf, 5);
                SelValue = atoi(Buf);
            }
            Options = UI_Normal_Fill_Roller_Options(SelValue, MaxValue, MinValue, OptStrLen);
            lv_roller_set_options(Roller, Options, LV_ROLLER_MODE_NORMAL);
            lv_mem_free(Options);
            lv_roller_set_selected(Roller, 3, FALSE);
            if (KeyData == KEY_UP)
            {
                lv_roller_set_selected(Roller, 2, TRUE);
            }
            else if (KeyData == KEY_DOWN)
            {
                lv_roller_set_selected(Roller, 4, TRUE);
            }
        }
        else
        {
            res = LV_RES_INV;
        }
    }
    else if (FocusedObj_Signal_Func.Old_Signal_Func)
    {
        res = FocusedObj_Signal_Func.Old_Signal_Func(Roller, sign, param);
    }

    return(res);
} /* UI_Normal_Roller_Signal */


/**
 * Set ContainerList Bar Value
 * param (in) : KeyValue
 * return  lv_res_t
 */
static lv_res_t UI_Normal_Set_ItemBar_Value(UI_KEY_VALUE KeyData)
{
    lv_obj_t *ItemBtn = lv_list_get_btn_selected(lv_group_get_focused(Group));
    lv_obj_t *ItemObj = lv_obj_get_child(ItemBtn, NULL);

    if (UI_Get_User_Num(ItemObj) == 1)
    {
        if (KeyData == KEY_LEFT)
        {
            lv_slider_set_value(ItemObj, lv_slider_get_value(ItemObj) - 1, LV_ANIM_OFF);
            return(LV_RES_OK);
        }
        else if (KeyData == KEY_RIGHT)
        {
            lv_slider_set_value(ItemObj, lv_slider_get_value(ItemObj) + 1, LV_ANIM_OFF);
            return(LV_RES_OK);
        }
    }
    return(LV_RES_INV);
}


/**
 * call Btn_Sel_Func if Btn is Selected
 * param (in) : list:lv_obj_t*;btn lv_obj_t *
 * return  VOID
 */
static VOID UI_Normal_List_Set_Btn_Selected(lv_obj_t *list, lv_obj_t *btn)
{
    lv_list_focus_btn(list, btn);
    if (Btn_Sel_Func)
    {
        Btn_Sel_Func(list, btn);
    }
}


/**
 * Process List Key
 * param (in) : List pointer if focused list; KeyData;
 * return  lv_res_t
 */
static lv_res_t UI_Normal_List_Signal(lv_obj_t *List, UI_KEY_VALUE KeyData)
{
    lv_res_t      res      = LV_RES_OK;
    lv_list_ext_t *ListExt = lv_obj_get_ext_attr(List);

    if (KeyData == KEY_DOWN)
    {
        if (ListExt->act_sel_btn)
        {
            lv_obj_t *btn_prev = lv_list_get_next_btn(List, ListExt->act_sel_btn);
            if (btn_prev && !lv_obj_get_hidden(btn_prev))
            {
                UI_Normal_List_Set_Btn_Selected(List, btn_prev);
            }
            else
            {
                lv_obj_t *btn = lv_list_get_next_btn(List, NULL);
                if (btn && !lv_obj_get_hidden(btn))
                {
                    UI_Normal_List_Set_Btn_Selected(List, btn);            /*for Loop selection*/
                }
            }
        }
        else
        {
            lv_obj_t *btn = lv_list_get_next_btn(List, NULL);
            if (btn && !lv_obj_get_hidden(btn))
            {
                UI_Normal_List_Set_Btn_Selected(List, btn);            /*If there are no buttons on the list then there is no first button*/
            }
        }
    }
    else if (KeyData == KEY_UP)
    {
        /*If there is a valid selected button the make the next selected*/
        if (ListExt->act_sel_btn != NULL)
        {
            lv_obj_t *btn_next = lv_list_get_prev_btn(List, ListExt->act_sel_btn);
            if (btn_next && !lv_obj_get_hidden(btn_next))
            {
                UI_Normal_List_Set_Btn_Selected(List, btn_next);
            }
            else
            {
                lv_obj_t *btn = lv_list_get_prev_btn(List, NULL);
                if (btn && !lv_obj_get_hidden(btn))
                {
                    UI_Normal_List_Set_Btn_Selected(List, btn);                /*for Loop selection*/
                }
            }
        }
        /*If there is no selected button the make the first selected*/
        else
        {
            lv_obj_t *btn = lv_list_get_next_btn(List, NULL);
            if (btn && !lv_obj_get_hidden(btn))
            {
                UI_Normal_List_Set_Btn_Selected(List, btn);
            }
        }
    }
    else if (KeyData == KEY_OK)
    {
        if ((NULL != ListExt->act_sel_btn) && (lv_btn_get_state(ListExt->act_sel_btn) != LV_BTN_STATE_DISABLED))
        {
            res = LV_RES_INV;
        }
    }
    else if (KeyData == KEY_LEFT || KeyData == KEY_RIGHT)
    {
    }
    else
    {
        res = LV_RES_INV;
    }

    return(res);
} /* UI_Normal_List_Signal */


/**
 * Get the number of days in a month
 * @param year a year
 * @param month a month. The range is basically [1..12] but [-11..1] is also supported to handle previous year
 * @return [28..31]
 */
static UINT8 UI_Normal_Get_Month_Length(INT32 year, INT32 month)
{
    UINT8 leap_year;

    month--;    /*Range of months id [1..12] but range of indexes is [0..11]*/
    if (month < 0)
    {
        year--;             /*Already in the previous year (won't be less then -12 to skip a whole year)*/
        month = 12 + month; /*`month` is negative, the result will be < 12*/
    }
    if (month >= 12)
    {
        year++;
        month -= 12;
    }
    leap_year = (year % 4) || ((year % 100 == 0) && (year % 400)) ? 0 : 1;
    /*month == 1 is february*/
    return((month == 1) ? (28 + leap_year) : 31 - month % 7 % 2);
}


/**
 * Process Calendar Key
 * param (in) : UI_KEY_VALUE KeyData
 * return  lv_res_t
 */
static lv_res_t UI_Normal_Calendar_Signal(lv_obj_t *Cale, UI_KEY_VALUE KeyData)
{
    lv_calendar_ext_t *ext = lv_obj_get_ext_attr(Cale);

    if (KeyData == KEY_UP)
    {
        if (ext->showed_date.day - 7 >= 1)
        {
            ext->showed_date.day = ext->showed_date.day - 7;
        }
        else
        {
            if (ext->showed_date.month <= 1)
            {
                ext->showed_date.month = 12;
                ext->showed_date.year--;
            }
            else
            {
                ext->showed_date.month--;
            }
            ext->showed_date.day = (ext->showed_date.day - 7) + UI_Normal_Get_Month_Length(
                ext->showed_date.year, ext->showed_date.month);
        }
    }
    else if (KeyData == KEY_DOWN)
    {
        if (ext->showed_date.day + 7 <=
            UI_Normal_Get_Month_Length(ext->showed_date.year, ext->showed_date.month))
        {
            ext->showed_date.day = ext->showed_date.day + 7;
        }
        else
        {
            ext->showed_date.day = (ext->showed_date.day + 7) - UI_Normal_Get_Month_Length(
                ext->showed_date.year, ext->showed_date.month);
            if (ext->showed_date.month >= 12)
            {
                ext->showed_date.month = 1;
                ext->showed_date.year++;
            }
            else
            {
                ext->showed_date.month++;
            }
        }
    }
    else if (KeyData == KEY_LEFT)
    {
        if (ext->showed_date.day > 1)
        {
            ext->showed_date.day--;
        }
        else
        {
            if (ext->showed_date.month <= 1)
            {
                ext->showed_date.month = 12;
                ext->showed_date.year--;
                ext->showed_date.day = 31;
            }
            else
            {
                ext->showed_date.month--;
                ext->showed_date.day = UI_Normal_Get_Month_Length(ext->showed_date.year,
                    ext->showed_date.month);
            }
        }
    }
    else if (KeyData == KEY_RIGHT)
    {
        if (ext->showed_date.day <
            UI_Normal_Get_Month_Length(ext->showed_date.year, ext->showed_date.month))
        {
            ext->showed_date.day++;
        }
        else
        {
            if (ext->showed_date.month >= 12)
            {
                ext->showed_date.month = 1;
                ext->showed_date.year++;
            }
            else
            {
                ext->showed_date.month++;
            }
            ext->showed_date.day = 1;
        }
    }
    else
    {
         return(LV_RES_INV);
    }

    ext->pressed_date.year = ext->showed_date.year;
    ext->pressed_date.month = ext->showed_date.month;
    ext->pressed_date.day = ext->showed_date.day;

    lv_obj_t *ContHeader = lv_obj_get_child(Cale, NULL);
    lv_obj_t *LabelL = lv_obj_get_child_back(ContHeader, NULL);
    lv_obj_t *LabelR = lv_obj_get_child_back(ContHeader, LabelL);
    INT8 Text[20];
    if (UI_LANG_CH == lv_lang_act())
    {
        snprintf(Text, 20, "%d.%d",
                 ext->showed_date.year,
                 ext->showed_date.month);
    }
    else
    {
        INT8 *EnMonth[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
        snprintf(Text, 20, "%s %d",
                 EnMonth[ext->showed_date.month - 1],
                 ext->showed_date.year);
    }
    lv_label_set_text(LabelL, Text);
    UI_Cale_Info_Cb Cb = (UI_Cale_Info_Cb)UI_Get_User_Ptr(Cale);
    if (Cb)
    {
        Cb(&ext->showed_date, Text);
        lv_label_set_text(LabelR, Text);
    }
    else
    {
        lv_label_set_text(LabelR, "");
    }
    lv_obj_align(LabelR, ContHeader, LV_ALIGN_IN_RIGHT_MID, 0, 0);

    lv_obj_invalidate(Cale);

    return(LV_RES_OK);
} /* UI_Calendar_Signal */


/**
 * Set Current Window
 * param (in) pointer to  win
 * return  VOID
 */
static VOID UI_Normal_Current_Win_Set(lv_obj_t *Win)
{
    if (UI_Normal_Current_Win)
    {
        UI_Normal_Last_Win = UI_Normal_Current_Win;
    }

    UI_Normal_Current_Win = Win;
}


/**
 * Set Key Function
 * param (in) pointer to UI_Handle_Key_CallBack
 * return  VOID
 */
static VOID UI_Normal_KeyFunc_Set(UI_Handle_Key_CallBack *keyfunc)
{
    Key_Func = keyfunc;
}


static VOID UI_Normal_Set_Focused_Obj(lv_group_t *group)
{
    lv_obj_t *FocusedObj = lv_group_get_focused(group);

    FocusedObj_Signal_Func.GroupObj = FocusedObj;
    if (lv_obj_get_signal_cb(FocusedObj) != UI_Normal_New_Signal_Func)
    {
        FocusedObj_Signal_Func.Old_Signal_Func = lv_obj_get_signal_cb(FocusedObj);
        lv_obj_set_signal_cb(FocusedObj, UI_Normal_New_Signal_Func);
    }
}


/**
 * Set Key Function
 * param (in)
 * return
 */
static lv_res_t UI_Normal_New_Signal_Func(struct _lv_obj_t *obj, lv_signal_t sign, void *param)
{
    UI_KEY_VALUE           KeyData;
    If_Setting_Play_Tone_t *SettingPlayTone = NULL;

    if (FALSE == Framework_Get_Phone_Ready_Status())
    {
        return(LV_RES_OK);
    }

    if (TRUE == WakeupWithKey)
    {
        /* UI will wake up if any key is pressed, then the key released will be sent to UI and
         * trigger the UI function. Disable the released key. */
        if (sign == LV_SIGNAL_CONTROL)
        {
            WakeupWithKey = FALSE;
            return(LV_RES_OK);
        }
        else if (sign == LV_SIGNAL_LONG_PRESS)
        {
            return(LV_RES_OK);
        }
    }

    if (FocusedObj_Signal_Func.GroupType & UI_GROUP_TYPE_ROLLER)
    {
        if (UI_Normal_Roller_Signal(obj, sign, param) == LV_RES_OK)
        {
            return(LV_RES_OK);
        }
    }

#ifndef USE_LV_INTERPHONE_DEMO
    if (param == NULL)
    {
        if (FocusedObj_Signal_Func.Old_Signal_Func)
        {
            return(FocusedObj_Signal_Func.Old_Signal_Func(obj, sign, param));
        }
        else
        {
            UI_Log_Out(UI_SUB_MODULE_COMMON_UI, UI_LOG_LEVEL_ERROR,
                "%s, Error:The orignal signal function is NULL!\n",__FUNCTION__);
            return(LV_RES_INV);
        }
    }
#endif

    if (param)
    {
        KeyData = *(UI_KEY_VALUE *)param;
    }
    if (sign == LV_SIGNAL_PRESSED)
    {
        if(FALSE == Framework_Get_Lcd_Status()) {
            Framework_Set_Lcd_Status(TRUE);
        }

        if ((IF_FRAMEWORK_INIT_CHARGE != Framework_Get_Init_Type())
            && (FALSE == Call_Setting_Is_Call_Present())
#if USE_LV_INTERPHONE_TEST
            && (FALSE == Interphone_Test_Is_Call_Present())
#endif
            && (FALSE == Audio_Player_Is_Running()))
        {
            // set keypad tones
            SettingPlayTone =
                (If_Setting_Play_Tone_t *)Hal_Mem_Alloc(sizeof(If_Setting_Play_Tone_t));
            Hal_Mem_Set(SettingPlayTone, 0, sizeof(If_Setting_Play_Tone_t));
            SettingPlayTone->ToneType = IF_SETTING_TONS_TYPE_KEYPAD;
            SettingPlayTone->PlayCtrl = IF_SETTING_PLAY_TONS_START;
            Setting_Play_Tone_Req(SettingPlayTone);
        }

        if (!Ime_Is_Active())
        {
            UI_Normal_Set_BtnPress_Effect(KEY_PRESSED, KeyData);
        }
        return(LV_RES_OK);
    }
    else if (sign == LV_SIGNAL_CONTROL)
    {
        if (!Ime_Is_Active())
        {
            UI_Normal_Set_BtnPress_Effect(KEY_RELEASED, KeyData);
        }
        if (Ime_Signal(KeyData) == LV_RES_INV)
        {
            return(LV_RES_OK);
        }
        if ((FocusedObj_Signal_Func.GroupType & UI_GROUP_TYPE_LIST_BAR) == UI_GROUP_TYPE_LIST_BAR)
        {
            UI_Normal_Set_ItemBar_Value(KeyData);
        }
        if (FocusedObj_Signal_Func.GroupType & UI_GROUP_TYPE_CALENDAR)
        {
            UI_Normal_Calendar_Signal(obj, KeyData);
        }

        ACTIVITY_ID TopAct = Nav_Get_Top();

        if((KEY_END == KeyData)
            && (TRUE == Call_Setting_Is_Call_Present())
            &&((ACT_ID_CALL_EMERGENCY_CALLING > TopAct) || (ACT_ID_CALL_DTMF_INPUT < TopAct)))
        {
            Call_Framework_Disconnect_Req();
            return(LV_RES_OK);
        }
        else
        {
            if (Key_Func && Key_Func(obj, KEY_RELEASED, KeyData) != 0)
            {
                return(LV_RES_OK);
            }
        }

        if (FocusedObj_Signal_Func.GroupType & UI_GROUP_TYPE_LIST)
        {
            if (UI_Normal_List_Signal(obj, KeyData) == LV_RES_OK)
            {
                return(LV_RES_OK);
            }
        }
    }
    else if (sign == LV_SIGNAL_LONG_PRESS)
    {
        if (Key_Func && Key_Func(obj, KEY_LONGPRESS, KeyData) != 0)
        {
            return(LV_RES_OK);
        }
    }
    if (FocusedObj_Signal_Func.Old_Signal_Func)
    {
        if ((LV_SIGNAL_CONTROL == sign)
            && (KEY_OK == KeyData)
            && (FocusedObj_Signal_Func.GroupType & UI_GROUP_TYPE_LIST))
        {
            return(FocusedObj_Signal_Func.Old_Signal_Func(obj, LV_SIGNAL_RELEASED, param));
        }
        else
        {
            return(FocusedObj_Signal_Func.Old_Signal_Func(obj, sign, param));
        }
    }
    else
    {
        UI_Log_Out(UI_SUB_MODULE_COMMON_UI, UI_LOG_LEVEL_ERROR,
            "%s, Error:The orignal signal function is NULL!!\n",__FUNCTION__);
        return(LV_RES_INV);
    }
} /* UI_Normal_New_Signal_Func */

/**********************
*   GLOBAL FUNCTIONS
**********************/
/**
 * Set user_num for obj
 * param (in) Obj: lv_obj_t *
 * param (in) User_Num: UINT32
 * return  VOID
 */
VOID UI_Set_User_Num(lv_obj_t * Obj, UINT32 User_Num)
{
    lv_obj_user_data_t * User_Data = lv_obj_get_user_data_ptr(Obj);
    User_Data->user_num = User_Num;
}


/**
 * Set user_ptr for obj
 * param (in) Obj: lv_obj_t *
 * param (in) User_Ptr: VOID *
 * return  VOID
 */
VOID UI_Set_User_Ptr(lv_obj_t * Obj, VOID * User_Ptr)
{
    lv_obj_user_data_t * User_Data = lv_obj_get_user_data_ptr(Obj);
    User_Data->user_data = User_Ptr;
}


/**
 * Get user_num for obj
 * param (in) Obj: lv_obj_t *
 * return  UINT32
 */
UINT32 UI_Get_User_Num(lv_obj_t * Obj)
{
    lv_obj_user_data_t * User_Data = lv_obj_get_user_data_ptr(Obj);
    return User_Data->user_num;
}


/**
 * Get user_ptr for obj
 * param (in) Obj: lv_obj_t *
 * return  VOID *
 */
VOID * UI_Get_User_Ptr(lv_obj_t * Obj)
{
    lv_obj_user_data_t * User_Data = lv_obj_get_user_data_ptr(Obj);
    return User_Data->user_data;
}


/**
 * Creat Normal_List_Only
 * param (in) NormalLstOnlyDesc: UI_Normal_List_Only_Desc_t*
 * return  VOID
 */
VOID UI_Normal_List_Only_Create(VOID *NormalLstOnlyDesc)
{
    unsigned int i = 0;
    INT8         *Text;

    if (NormalLstOnlyDesc == NULL)
    {
        return;
    }
    UI_Normal_List_Only_Desc_t *LstOnlyDesc = (UI_Normal_List_Only_Desc_t *)NormalLstOnlyDesc;
    lv_obj_t                   *Win         = UI_Normal_Win_Create(TRUE, &(LstOnlyDesc->TitleBar));

    LstOnlyDesc->List.List = lv_list_create(Win, NULL);
    lv_list_set_scrollbar_mode(LstOnlyDesc->List.List, LV_SCROLLBAR_MODE_HIDE);
    lv_obj_set_size(LstOnlyDesc->List.List, FP_HOR_RES, FP_CONT_BAR_H);
    lv_obj_align(LstOnlyDesc->List.List, NULL, LV_ALIGN_IN_TOP_MID, 0, FP_TITLE_BAR_H);
    UI_Normal_Group_Create(LstOnlyDesc->List.List, NULL, NULL);

    for (i = 0; i < LstOnlyDesc->List.ListButtonCnt; i++)
    {
        if (LstOnlyDesc->List.ButtonList[i].TxtId != LV_LANG_TXT_ID_NONE)
        {
            Text = (INT8 *)lv_lang_get_text(LstOnlyDesc->List.ButtonList[i].TxtId);
        }
        else
        {
            Text = LstOnlyDesc->List.ButtonList[i].BtnTxt;
            if(NULL == Text)
            {
                Text = "";
            }
        }
        if (LstOnlyDesc->List.ButtonList[i].ButtonIndex == 0xFF)
        {
            LstOnlyDesc->List.ButtonList[i].Button = UI_Normal_BtnContList_Add(
                LstOnlyDesc->List.List,  LstOnlyDesc->List.ButtonList[i], 0);
        }
        else
        {
            LstOnlyDesc->List.ButtonList[i].Button
                = lv_list_add_btn(LstOnlyDesc->List.List,
                                  LstOnlyDesc->List.ButtonList[i].SymbolId1,
                                  Text);
            lv_obj_set_event_cb(LstOnlyDesc->List.ButtonList[i].Button,
                                LstOnlyDesc->List.ButtonList[i].ReleaseFun);
            if (LstOnlyDesc->List.ButtonList[i].SymbolId1)
            {
                lv_obj_add_style(lv_obj_get_child_back(LstOnlyDesc->List.ButtonList[i].Button,
                                                       NULL),
                                 LV_IMG_PART_MAIN,
                                 &img_light);
            }
        }

        if (LstOnlyDesc->List.ButtonList[i].Valid == FALSE)
        {
            lv_btn_set_state(LstOnlyDesc->List.ButtonList[i].Button,LV_BTN_STATE_DISABLED);
        }
        if (i != 0 && i == LstOnlyDesc->List.Index)
        {
            lv_list_focus_btn(LstOnlyDesc->List.List,LstOnlyDesc->List.ButtonList[i].Button);
        }
    }

    UI_Normal_KeyFunc_Set(LstOnlyDesc->KeyFunc);
#ifndef USE_LV_INTERPHONE_DEMO
    UI_Normal_ButtonBar_Create(&(LstOnlyDesc->BtnBar), Win);
#endif
    FocusedObj_Signal_Func.GroupType = UI_GROUP_TYPE_LIST;
} /* UI_Normal_List_Only_Create */


/**
 * Creat Normal_Ta_Only
 * param (in) NormalTaOnlyDesc: UI_Normal_Ta_Only_Desc_t*
 * return  VOID
 */
VOID UI_Normal_Ta_Only_Create(VOID *NormalTaOnlyDesc)
{
    if (NormalTaOnlyDesc == NULL)
    {
        return;
    }
    UI_Normal_Ta_Only_Desc_t *TaOnlyDesc = (UI_Normal_Ta_Only_Desc_t *)NormalTaOnlyDesc;

    lv_obj_t                 *Win = UI_Normal_Win_Create(FALSE, NULL);
    lv_win_set_scrollbar_mode(Win, LV_SCROLLBAR_MODE_HIDE);

    lv_obj_t *Cont = lv_cont_create(Win, NULL);
    lv_obj_set_size(Cont, FP_HOR_RES, FP_CONT_BAR_H);

    UI_ObjAlign_Info_t AlignInfo;
    memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t));
    AlignInfo.Align            = LV_ALIGN_IN_TOP_LEFT;
    AlignInfo.y                = FP_CONT_BAR_H / 3;
    TaOnlyDesc->TitleBar.Label = UI_Normal_Label_Create(Cont, &(TaOnlyDesc->TitleBar), FP_HOR_RES,
        FP_CONT_BAR_H / 2, &AlignInfo);

    lv_obj_t *Ta = lv_textarea_create(Cont, NULL);
    lv_obj_set_size(Ta, FP_HOR_RES, FP_CONT_BAR_H / 2);
    lv_obj_align(Ta, NULL, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0);
    if (TaOnlyDesc->ContTa.TaTxt != NULL)
    {
        lv_textarea_set_text(Ta,  (const INT8 *)TaOnlyDesc->ContTa.TaTxt);
    }
    else
    {
        lv_textarea_set_text(Ta,"");
    }

    lv_textarea_set_cursor_hidden(Ta, TaOnlyDesc->ContTa.TaCursorHide);
    TaOnlyDesc->ContTa.TextArea = Ta;
    // Set Ime
    Ime_Init();
    Ime_Set_Ta(Ta);
    UI_Normal_KeyFunc_Set(TaOnlyDesc->KeyFunc);
    UI_Normal_Group_Create(Ta, NULL, NULL);
    UI_Normal_ButtonBar_Create(&(TaOnlyDesc->ButtonBar), Win);
}


/**
 * Creat Normal_Label_Only
 * param (in) NormalLblOnlyDesc: UI_Normal_Label_Only_Desc_t*
 * return  VOID
 */
VOID UI_Normal_Label_Only_Create(VOID *NormalLblOnlyDesc)
{
    if (NormalLblOnlyDesc == NULL)
    {
        return;
    }
    UI_Normal_Label_Only_Desc_t *LblOnlyDesc = (UI_Normal_Label_Only_Desc_t *)NormalLblOnlyDesc;

    lv_obj_t                    *Win = UI_Normal_Win_Create(TRUE, &(LblOnlyDesc->TitleBar));
    lv_win_set_scrollbar_mode(Win, LV_SCROLLBAR_MODE_HIDE);

    UI_ObjAlign_Info_t AlignInfo;
    memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t));
    AlignInfo.Align              = LV_ALIGN_IN_TOP_LEFT;
    AlignInfo.y                  = FP_TITLE_BAR_H;
    LblOnlyDesc->ContLabel.Label = UI_Normal_Label_Create(Win, &(LblOnlyDesc->ContLabel),FP_HOR_RES,
        FP_CONT_BAR_H, &AlignInfo);

    UI_Normal_ButtonBar_Create(&(LblOnlyDesc->ButtonBar), Win);

    UI_Normal_Group_Create(LblOnlyDesc->ContLabel.Label, NULL, NULL);
    UI_Normal_KeyFunc_Set(LblOnlyDesc->KeyFunc);
}


/**
 * Creat Normal_Container_List
 * param (in) NormalContLstDesc: UI_Normal_Container_List_Desc_t*
 * return  VOID
 */
VOID UI_Normal_Container_List_Create(VOID *NormalContLstDesc)
{
    if (NormalContLstDesc == NULL)
    {
        return;
    }
    UINT8                           i = 0;

    UI_Normal_Container_List_Desc_t *ContLstDesc =
        (UI_Normal_Container_List_Desc_t *)NormalContLstDesc;

    lv_obj_t *Win = UI_Normal_Win_Create(TRUE, &(ContLstDesc->TitleBar));

    lv_obj_t *List = lv_list_create(Win,NULL);
    lv_list_set_scrollbar_mode(List, LV_SCROLLBAR_MODE_OFF);
    lv_obj_set_size(List, FP_HOR_RES, FP_CONT_BAR_H);
    lv_obj_set_pos(List, 0, FP_TITLE_BAR_H - 2);
    UI_Normal_Group_Create(List, NULL, NULL);
    ContLstDesc->List                = List;
    FocusedObj_Signal_Func.GroupType = UI_GROUP_TYPE_LIST;
    for (i = 0; i < ContLstDesc->ContList.ListContainerCnt; i++)
    {
        ContLstDesc->ContList.ContainerList[i].Button =
            UI_Normal_ContList_Add(List, &(ContLstDesc->ContList.ContainerList[i]),
                ContLstDesc->ContList.Index);
    }

    if (  ContLstDesc->ContList.ContainerList[0].Choise == UI_BASE_OBJ_TA
       && ContLstDesc->ContList.ContainerList[0].Label.TxtId == PHONE_TEXT_ID_NAMES)
    {
        Ime_Init();
        Ime_Set_Ta(ContLstDesc->ContList.ContainerList[0].u.Ta.TextArea);
        lv_coord_t LastBtnY = lv_obj_get_y(List)
            + lv_obj_get_height(ContLstDesc->ContList.ContainerList[0].Button) * 2 + 4;
        Ime_Set_SymbolLabel_Pos(FP_SCROLLBAR_WIDTH, LastBtnY - 3);
        lv_obj_t *Cont = lv_cont_create(Win, NULL);
        lv_obj_set_size(Cont, FP_HOR_RES, FP_INPUT_CONT_H);
        lv_obj_set_pos(Cont, 0, LastBtnY + FP_INPUT_IME_SYMBOL_H - 3);

        Ime_Set_Parent(Cont);
    }
#ifndef USE_LV_INTERPHONE_DEMO
    UI_Normal_ButtonBar_Create(&(ContLstDesc->ButtonBar), Win);
#endif
    UI_Normal_KeyFunc_Set(ContLstDesc->KeyFunc);
} /* UI_Normal_Container_List_Create */


/**
 * Creat Normal_Time
 * param (in) NormalTimeDesc: UI_Normal_Time_Desc_t*
 * return  VOID
 */
VOID UI_Normal_Time_Create(VOID *NormalTimeDesc)
{
    if (NormalTimeDesc == NULL)
    {
        return;
    }

    UINT16                MaxValue;
    UINT16                MinValue;
    UINT8                 OptStrLen;
    INT8                  *Options;

    UI_Normal_Time_Desc_t *TimeDesc = (UI_Normal_Time_Desc_t *)NormalTimeDesc;

    lv_obj_t              *Win = UI_Normal_Win_Create(TRUE, &(TimeDesc->TitleBar));

    lv_obj_t              *Cont = lv_cont_create(Win, NULL);
    lv_obj_set_style_local_bg_opa(Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_0);
    lv_obj_set_style_local_pad_inner(Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, FP_HOR_RES / 20);
    lv_cont_set_fit(Cont, LV_FIT_TIGHT);
    lv_cont_set_layout(Cont, LV_LAYOUT_ROW_MID);

    lv_obj_t *RollerLeft = lv_roller_create(Cont, NULL);
    UI_Normal_Roller_Get_Opt_Info(TimeDesc->ContTime.Roller1.RollerType, &MaxValue, &MinValue,
        &OptStrLen);
    Options = UI_Normal_Fill_Roller_Options(TimeDesc->ContTime.Roller1.MidValue, MaxValue, MinValue,
        OptStrLen);
    lv_roller_set_options(RollerLeft,  Options, LV_ROLLER_MODE_NORMAL);
    Hal_Mem_Free(Options);
    lv_roller_set_visible_row_count(RollerLeft, 5);
    lv_roller_set_selected(RollerLeft, 3, FALSE);
    UI_Set_User_Num(RollerLeft, (UINT32)TimeDesc->ContTime.Roller1.RollerType);
    TimeDesc->ContTime.Roller1.Roller = RollerLeft;

    lv_obj_t *RollerRight = lv_roller_create(Cont, NULL);
    UI_Normal_Roller_Get_Opt_Info(TimeDesc->ContTime.Roller2.RollerType, &MaxValue, &MinValue,
        &OptStrLen);
    Options = UI_Normal_Fill_Roller_Options(TimeDesc->ContTime.Roller2.MidValue, MaxValue, MinValue,
        OptStrLen);
    lv_roller_set_options(RollerRight, Options, LV_ROLLER_MODE_NORMAL);
    Hal_Mem_Free(Options);
    lv_roller_set_visible_row_count(RollerRight, 5);
    lv_roller_set_selected(RollerRight, 3, FALSE);
    UI_Set_User_Num(RollerRight, (UINT32)TimeDesc->ContTime.Roller2.RollerType);
    TimeDesc->ContTime.Roller2.Roller = RollerRight;

    lv_obj_align(Cont, Win, LV_ALIGN_CENTER, 0, 0);

    UI_Normal_KeyFunc_Set(TimeDesc->KeyFunc);
    UI_Normal_Group_Create(RollerLeft, RollerRight, NULL);
    UI_Normal_ButtonBar_Create(&(TimeDesc->ButtonBar), Win);
    FocusedObj_Signal_Func.GroupType = UI_GROUP_TYPE_ROLLER;
} /* UI_Normal_Time_Create */


/**
 * Creat Normal_Date
 * param (in) NormalDateDesc: UI_Normal_Date_Desc_t*
 * return  VOID
 */
VOID UI_Normal_Date_Create(VOID *NormalDateDesc)
{
    if (NormalDateDesc == NULL)
    {
        return;
    }

    UINT16                MaxValue;
    UINT16                MinValue;
    UINT8                 OptStrLen;
    INT8                  *Options;

    UI_Normal_Date_Desc_t *DateDesc = (UI_Normal_Date_Desc_t *)NormalDateDesc;

    lv_obj_t              *Win = UI_Normal_Win_Create(TRUE, &(DateDesc->TitleBar));

    lv_obj_t              *Cont = lv_cont_create(Win, NULL);
    lv_obj_set_style_local_bg_opa(Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_0);
    lv_obj_set_style_local_pad_inner(Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, FP_HOR_RES / 24);
    lv_cont_set_fit(Cont, LV_FIT_TIGHT);
    lv_cont_set_layout(Cont, LV_LAYOUT_ROW_MID);

    lv_obj_t *Year_Roller = lv_roller_create(Cont, NULL);
    UI_Normal_Roller_Get_Opt_Info(DateDesc->ContDate.RollerYear.RollerType, &MaxValue, &MinValue,
        &OptStrLen);
    Options = UI_Normal_Fill_Roller_Options(DateDesc->ContDate.RollerYear.MidValue, MaxValue,
        MinValue, OptStrLen);
    lv_roller_set_options(Year_Roller, Options, LV_ROLLER_MODE_NORMAL);
    Hal_Mem_Free(Options);
    lv_roller_set_visible_row_count(Year_Roller, 5);
    lv_roller_set_selected(Year_Roller, 3, FALSE);
    UI_Set_User_Num(Year_Roller, (UINT32)DateDesc->ContDate.RollerYear.RollerType);
    DateDesc->ContDate.RollerYear.Roller = Year_Roller;

    lv_obj_t *Month_Roller = lv_roller_create(Cont, NULL);
    UI_Normal_Roller_Get_Opt_Info(DateDesc->ContDate.RollerMonth.RollerType, &MaxValue, &MinValue,
        &OptStrLen);
    Options = UI_Normal_Fill_Roller_Options(DateDesc->ContDate.RollerMonth.MidValue, MaxValue,
        MinValue, OptStrLen);
    lv_roller_set_options(Month_Roller, Options, LV_ROLLER_MODE_NORMAL);
    Hal_Mem_Free(Options);
    lv_roller_set_visible_row_count(Month_Roller, 5);
    lv_roller_set_selected(Month_Roller, 3, FALSE);
    UI_Set_User_Num(Month_Roller, (UINT32)DateDesc->ContDate.RollerMonth.RollerType);
    DateDesc->ContDate.RollerMonth.Roller = Month_Roller;

    lv_obj_t *Day_Roller = lv_roller_create(Cont, NULL);
    UI_Normal_Roller_Get_Opt_Info(DateDesc->ContDate.RollerDay.RollerType, &MaxValue, &MinValue,
        &OptStrLen);
    UI_Normal_Roller_Get_Max_Day(DateDesc->ContDate.RollerYear.MidValue,
        DateDesc->ContDate.RollerMonth.MidValue,&MaxValue);
    Options = UI_Normal_Fill_Roller_Options(DateDesc->ContDate.RollerDay.MidValue, MaxValue,
        MinValue, OptStrLen);
    lv_roller_set_options(Day_Roller, Options, LV_ROLLER_MODE_NORMAL);
    Hal_Mem_Free(Options);
    lv_roller_set_visible_row_count(Day_Roller, 5);
    lv_roller_set_selected(Day_Roller, 3, FALSE);
    UI_Set_User_Num(Day_Roller, (UINT32)DateDesc->ContDate.RollerDay.RollerType);
    DateDesc->ContDate.RollerDay.Roller = Day_Roller;

    lv_obj_align(Cont, Win, LV_ALIGN_CENTER, 0, 0);

    UI_Normal_KeyFunc_Set(DateDesc->KeyFunc);
    UI_Normal_Group_Create(Year_Roller, Month_Roller, Day_Roller);
    UI_Normal_ButtonBar_Create(&(DateDesc->ButtonBar), Win);
    FocusedObj_Signal_Func.GroupType = UI_GROUP_TYPE_ROLLER;
} /* UI_Normal_Date_Create */


/**
 * Creat Normal_Contact_Search_Button
 * param (in) NormalContSrhBtnDesc: UI_Normal_Contact_Search_Button_Desc_t*
 * return  VOID
 */
VOID UI_Normal_Contact_Search_Button_Create(VOID *NormalContSrhBtnDesc)
{
    if (NormalContSrhBtnDesc == NULL)
    {
        return;
    }

    UI_Normal_Contact_Search_Button_Desc_t *ContSrhBtnDesc =
        (UI_Normal_Contact_Search_Button_Desc_t *)NormalContSrhBtnDesc;

    lv_obj_t *Win =
        UI_Normal_Win_Create(TRUE, &(ContSrhBtnDesc->TitleBar));
    lv_win_set_scrollbar_mode(Win, LV_SCROLLBAR_MODE_HIDE);

    // search result list
    lv_obj_t *List = lv_list_create(Win,NULL);
    ContSrhBtnDesc->ButtonContainerTa.ContButtonScrl.List = List;
    lv_obj_set_size(List, FP_HOR_RES - FP_SCROLLBAR_WIDTH, FP_SEARCH_LIST_H);
    lv_obj_set_pos(List, 0, FP_TITLE_BAR_H);
    UI_Normal_Group_Create(List, NULL, NULL);
    for (UINT8 i = 0; i < UI_MAX_SEARCH_CONT_BTN_NUM; i++)
    {
        ContSrhBtnDesc->ButtonContainerTa.ContButtonScrl.ContButton[i].Button =
            UI_Normal_BtnContList_Add(List,
                ContSrhBtnDesc->ButtonContainerTa.ContButtonScrl.ContButton[i],
                FP_SEARCH_LIST_H / UI_MAX_SEARCH_CONT_BTN_NUM);
    }

    if (ContSrhBtnDesc->ButtonContainerTa.ContButtonScrl.Index < UI_MAX_SEARCH_CONT_BTN_NUM)
    {
        lv_list_focus_btn(List,
            ContSrhBtnDesc->ButtonContainerTa.ContButtonScrl.ContButton[ContSrhBtnDesc->
                                                                            ButtonContainerTa
                                                                            .
                                                                            ContButtonScrl
                                                                            .
                                                                            Index].Button);
    }

    // simulator scrl
    lv_obj_t *Cont = lv_cont_create(Win, NULL);
    /* lv_obj_set_size(Cont, FP_SCROLLBAR_WIDTH, */
    /*                 ContSrhBtnDesc->ButtonContainerTa.ContButtonScrl.Height); */
    /* lv_obj_set_pos(Cont, FP_HOR_RES - FP_SCROLLBAR_WIDTH, */
    /*     FP_TITLE_BAR_H + ContSrhBtnDesc->ButtonContainerTa.ContButtonScrl.PosY); */
    /* lv_obj_align(Cont, Win, LV_ALIGN_IN_TOP_RIGHT, -4, */
    /*              FP_TITLE_BAR_H + ContSrhBtnDesc->ButtonContainerTa.ContButtonScrl.PosY); */
    lv_obj_set_style_local_bg_color(Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY);
    lv_obj_set_style_local_bg_opa(Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_80);
    ContSrhBtnDesc->ButtonContainerTa.ContButtonScrl.ContScrl.Container = Cont;

    // search box  label+ta
    /* UI_ObjAlign_Info_t AlignInfo; */
    /* memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t)); */
    /* AlignInfo.RefObj                                              = List; */
    /* AlignInfo.Align                                               = LV_ALIGN_OUT_BOTTOM_LEFT; */
    /* ContSrhBtnDesc->ButtonContainerTa.ContLabelTa.ContLabel.Label = */
    /*     UI_Normal_Label_Create(Win, &(ContSrhBtnDesc->ButtonContainerTa.ContLabelTa.ContLabel), */
    /*         FP_HOR_RES, FP_VER_RES / 10, &AlignInfo); */

    lv_obj_t *Ta = lv_textarea_create(Win, NULL);
    lv_obj_set_size(Ta, FP_HOR_RES, FP_INPUT_TA_H);
    lv_obj_align(Ta, List, LV_ALIGN_OUT_BOTTOM_LEFT, 0, FP_INPUT_CONT_H + FP_INPUT_IME_SYMBOL_H);
    if (ContSrhBtnDesc->ButtonContainerTa.ContLabelTa.ContTa.TaTxt != NULL)
    {
        lv_textarea_set_text(Ta,(const INT8 *)ContSrhBtnDesc->ButtonContainerTa.ContLabelTa.ContTa.TaTxt);
    }
    lv_textarea_set_cursor_hidden(Ta, ContSrhBtnDesc->ButtonContainerTa.ContLabelTa.ContTa.TaCursorHide);
    lv_textarea_set_one_line(Ta, TRUE);
    ContSrhBtnDesc->ButtonContainerTa.ContLabelTa.ContTa.TextArea = Ta;

    /* // Set Ime */
    Ime_Init();
    Ime_Set_Ta(Ta);
    Ime_Set_SymbolLabel_Pos(FP_SCROLLBAR_WIDTH, lv_obj_get_y(List) + FP_SEARCH_LIST_H + 4);
    lv_obj_t *ImeCont = lv_cont_create(Win, NULL);
    lv_obj_set_size(ImeCont, FP_HOR_RES, FP_INPUT_CONT_H);
    lv_obj_align(ImeCont, Ta, LV_ALIGN_OUT_TOP_LEFT, 0, 0);
    lv_obj_add_style(ImeCont, LV_CONT_PART_MAIN, &lv_style_transp);
    Ime_Set_Parent(ImeCont);

    UI_Normal_KeyFunc_Set(ContSrhBtnDesc->KeyFunc);
    UI_Normal_ButtonBar_Create(&(ContSrhBtnDesc->ButtonBar), Win);
    FocusedObj_Signal_Func.GroupType = UI_GROUP_TYPE_LIST;
} /* UI_Normal_Contact_Search_Button_Create */


/**
 * Creat UI_Normal_Contact_Search_Label
 * param (in) NormalContSrhLblDesc: UI_Normal_Contact_Search_Label_Desc_t*
 * return  VOID
 */
VOID UI_Normal_Contact_Search_Label_Create(VOID *NormalContSrhLblDesc)
{
    if (NormalContSrhLblDesc == NULL)
    {
        return;
    }
    UI_Normal_Contact_Search_Label_Desc_t *ContSrhLblDesc =
        (UI_Normal_Contact_Search_Label_Desc_t *)NormalContSrhLblDesc;

    lv_obj_t *Win =
        UI_Normal_Win_Create(TRUE, &(ContSrhLblDesc->TitleBar));
    lv_win_set_scrollbar_mode(Win, LV_SCROLLBAR_MODE_HIDE);

    // search no result label
    UI_ObjAlign_Info_t AlignInfo;
    memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t));
    AlignInfo.Align                         = LV_ALIGN_IN_TOP_LEFT;
    AlignInfo.y                             = FP_TITLE_BAR_H;
    ContSrhLblDesc->LabelTa.ContLabel.Label =
        UI_Normal_Label_Create(Win, &(ContSrhLblDesc->LabelTa.ContLabel), FP_HOR_RES, FP_CONT_BAR_H,
            &AlignInfo);

    // search box  label+ta
    lv_obj_t *Ta = lv_textarea_create(Win, NULL);
    lv_obj_set_size(Ta, FP_HOR_RES, FP_VER_RES / 10);
    lv_obj_set_pos(Ta, 0, FP_CONT_BAR_H - FP_VER_RES / 10);

    if (ContSrhLblDesc->LabelTa.ContLabelTa.ContTa.TaTxt != NULL)
    {
        lv_textarea_set_text(Ta, (const INT8 *)ContSrhLblDesc->LabelTa.ContLabelTa.ContTa.TaTxt);
    }
    lv_textarea_set_cursor_hidden(Ta, ContSrhLblDesc->LabelTa.ContLabelTa.ContTa.TaCursorHide);
    ContSrhLblDesc->LabelTa.ContLabelTa.ContTa.TextArea = Ta;

    AlignInfo.RefObj                                    = Ta;
    AlignInfo.Align                                     = LV_ALIGN_OUT_TOP_LEFT;
    AlignInfo.y                                         = 0;
    ContSrhLblDesc->LabelTa.ContLabelTa.ContLabel.Label =
        UI_Normal_Label_Create(Win, &(ContSrhLblDesc->LabelTa.ContLabelTa.ContLabel), FP_HOR_RES,
            FP_VER_RES / 16,&AlignInfo);

    UI_Normal_KeyFunc_Set(ContSrhLblDesc->KeyFunc);
    UI_Normal_Group_Create(Ta, NULL, NULL);
    UI_Normal_ButtonBar_Create(&(ContSrhLblDesc->ButtonBar), Win);
} /* UI_Normal_Contact_Search_Label_Create */


/**
 * Creat Normal_Button_Container
 * param (in) NormalBtnContDesc: UI_Normal_Button_Container_Desc_t*
 * return  VOID
 */
VOID UI_Normal_Button_Container_Create(VOID *NormalBtnContDesc)
{
    if (NormalBtnContDesc == NULL)
    {
        return;
    }

    UI_Normal_Button_Container_Desc_t *BtnContDesc =
        (UI_Normal_Button_Container_Desc_t *)NormalBtnContDesc;
    lv_obj_t                          *Win =
        UI_Normal_Win_Create(TRUE, &(BtnContDesc->TitleBar));
    lv_win_set_scrollbar_mode(Win, LV_SCROLLBAR_MODE_HIDE);

    if (BtnContDesc->Label.TxtId == PHONE_TEXT_ID_EMPTY)
    {
        UI_ObjAlign_Info_t AlignInfo;
        memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t));
        AlignInfo.Align          = LV_ALIGN_IN_TOP_LEFT;
        AlignInfo.y              = FP_TITLE_BAR_H;
        BtnContDesc->Label.Label = UI_Normal_Label_Create(Win, &(BtnContDesc->Label),FP_HOR_RES, 0,
            &AlignInfo);
        UI_Normal_Group_Create(Win, NULL, NULL);
    }
    else
    {
        lv_obj_t *List = lv_list_create(Win,NULL);
        BtnContDesc->ButtonContainer.List = List;
        lv_obj_set_size(List,FP_HOR_RES - FP_SCROLLBAR_WIDTH, FP_CONT_BAR_H);
        lv_obj_set_pos(List, 0, FP_TITLE_BAR_H);
        UI_Normal_Group_Create(List, NULL, NULL);
        for (UINT8 i = 0; i < UI_MAX_CONT_BTN_NUM; i++)
        {
            if (BtnContDesc->ButtonContainer.ContButton[i].Valid == TRUE)
            {
                BtnContDesc->ButtonContainer.ContButton[i].Button
                    = UI_Normal_BtnContList_Add(List,BtnContDesc->ButtonContainer.ContButton[i],
                    FP_CONT_BAR_H / UI_MAX_CONT_BTN_NUM);
            }
            else
            {
                break;
            }
        }
        if (  BtnContDesc->ButtonContainer.Index > 0
           && BtnContDesc->ButtonContainer.Index < UI_MAX_CONT_BTN_NUM)
        {
            lv_list_focus_btn(List,
                BtnContDesc->ButtonContainer.ContButton[BtnContDesc->ButtonContainer.Index].Button);
        }
        FocusedObj_Signal_Func.GroupType = UI_GROUP_TYPE_LIST;

        /*simulate scrollbar*/
        lv_obj_t *Cont = lv_cont_create(Win, NULL);
        /* lv_obj_set_size(Cont, FP_SCROLLBAR_WIDTH, BtnContDesc->ButtonContainer.Height); */
        lv_obj_set_style_local_bg_color(Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY);
        /* lv_obj_align(Cont, Win, LV_ALIGN_IN_TOP_RIGHT, */
        /*              -4, */
        /*              FP_TITLE_BAR_H + BtnContDesc->ButtonContainer.PosY); */
        BtnContDesc->ButtonContainer.ContScrl.Container = Cont;
    }

    UI_Normal_KeyFunc_Set(BtnContDesc->KeyFunc);
    UI_Normal_ButtonBar_Create(&(BtnContDesc->ButtonBar), Win);
} /* UI_Normal_Button_Container_Create */


/**
 * Animation start callback for alarm ringing
 * param (in) a: lv_anim_t *
 * return  VOID
 */
VOID UI_Alarm_Anim_Start_Cb(lv_anim_t * a)
{
    lv_btn_state_t State = lv_btn_get_state(a->var);
    if (State == LV_BTN_STATE_RELEASED)
    {
        lv_btn_set_state(a->var, LV_BTN_STATE_PRESSED);
    }
    else if (State == LV_BTN_STATE_PRESSED)
    {
        lv_btn_set_state(a->var, LV_BTN_STATE_RELEASED);
    }
    else
    {
        printf("%s: wrong btn state %d\n", __FUNCTION__, State);
    }
}


/**
 * Creat Normal_Alarm
 * param (in) NormalAlarmDesc: UI_Normal_Alarm_Desc_t*
 * return  VOID
 */
VOID UI_Normal_Alarm_Create(VOID *NormalAlarmDesc)
{
    if (NormalAlarmDesc == NULL)
    {
        return;
    }
    UI_Normal_Alarm_Desc_t *AlarmDesc = (UI_Normal_Alarm_Desc_t *)NormalAlarmDesc;

    lv_obj_t               *Win = UI_Normal_Win_Create(TRUE, &(AlarmDesc->TitleBar));
    lv_win_set_scrollbar_mode(Win, LV_SCROLLBAR_MODE_HIDE);

    lv_obj_t          *btn = lv_btn_create(Win,NULL);
    lv_obj_set_size(btn, FP_HOR_RES / 3, FP_HOR_RES / 3);
    lv_obj_align(btn, AlarmDesc->TitleBar.Label, LV_ALIGN_OUT_BOTTOM_MID, 0, FP_CONT_BAR_H / 3);
    lv_obj_t *img = lv_img_create(btn,NULL);
    lv_img_set_src(img,&IMG_ALARM_RING);

    UI_ObjAlign_Info_t AlignInfo;
    memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t));
    AlignInfo.RefObj           = AlarmDesc->TitleBar.Label;
    AlignInfo.Align            = LV_ALIGN_OUT_BOTTOM_MID;
    AlignInfo.y                = FP_TITLE_BAR_H;
    AlarmDesc->AnimLabel.Label = UI_Normal_Label_Create(Win, &(AlarmDesc->AnimLabel), FP_HOR_RES,
        FP_CONT_BAR_H / 5,&AlignInfo);
    INT8 Time[6];
    snprintf(Time, 6, "%02d:%02d", AlarmDesc->AnimLabel.TxtId >> 8,
        AlarmDesc->AnimLabel.TxtId & 0xFF);
    lv_label_set_text(AlarmDesc->AnimLabel.Label, Time);

    lv_obj_set_style_local_radius(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 100);
    lv_obj_set_style_local_border_width(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 8);
    lv_obj_set_style_local_border_color(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE);
    lv_obj_set_style_local_border_opa(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_20);
    lv_obj_set_style_local_shadow_width(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 6);
    lv_obj_set_style_local_shadow_color(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY);
    lv_obj_set_style_local_shadow_spread(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 6);
    lv_obj_set_style_local_border_width(btn, LV_BTN_PART_MAIN, LV_STATE_PRESSED, 2);
    lv_obj_set_style_local_border_opa(btn, LV_BTN_PART_MAIN, LV_STATE_PRESSED, LV_OPA_30);
    lv_obj_set_style_local_shadow_width(btn, LV_BTN_PART_MAIN, LV_STATE_PRESSED, 10);
    lv_obj_set_style_local_shadow_spread(btn, LV_BTN_PART_MAIN, LV_STATE_PRESSED, 10);
    lv_obj_set_style_local_bg_opa(btn, LV_BTN_PART_MAIN, LV_STATE_PRESSED,
                                  lv_obj_get_style_bg_opa(btn, LV_BTN_PART_MAIN));
    lv_obj_set_style_local_bg_color(btn, LV_BTN_PART_MAIN, LV_STATE_PRESSED,
                                    lv_obj_get_style_bg_color(btn, LV_BTN_PART_MAIN));
    lv_obj_set_style_local_transition_time(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 800);
    lv_obj_set_style_local_transition_prop_1(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT,
                                             LV_STYLE_BORDER_OPA);
    lv_obj_set_style_local_transition_prop_2(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT,
                                             LV_STYLE_BORDER_WIDTH);
    lv_obj_set_style_local_transition_prop_3(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT,
                                             LV_STYLE_SHADOW_WIDTH);
    lv_obj_set_style_local_transition_prop_4(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT,
                                             LV_STYLE_SHADOW_SPREAD);

    lv_anim_t a = {};
    lv_anim_init(&a);
    lv_anim_set_var(&a, btn);
    lv_anim_set_delay(&a, 500);
    lv_anim_set_time(&a, 800);
    lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
    lv_anim_set_repeat_delay(&a, 0);
    lv_anim_set_start_cb(&a, UI_Alarm_Anim_Start_Cb);
    lv_anim_start(&a);

    UI_Normal_KeyFunc_Set(AlarmDesc->KeyFunc);
    UI_Normal_Group_Create(Win, NULL, NULL);

    UI_Normal_ButtonBar_Create(&(AlarmDesc->ButtonBar), Win);
} /* UI_Normal_Alarm_Create */


/**
 * Creat Normal_Reminder
 * param (in) NormalReminderDesc: UI_Normal_Reminder_Desc_t*
 * return  VOID
 */
VOID UI_Normal_Reminder_Create(VOID *NormalReminderDesc)
{
    if (NormalReminderDesc == NULL)
    {
        return;
    }
    UI_Normal_Reminder_Desc_t *ReminderDesc = (UI_Normal_Reminder_Desc_t *)NormalReminderDesc;
    lv_obj_t                  *Win          = UI_Normal_Win_Create(FALSE, NULL);
    lv_win_set_scrollbar_mode(Win, LV_SCROLLBAR_MODE_HIDE);

    lv_obj_t *TitleCont = lv_cont_create(Win, NULL);
    lv_obj_set_size(TitleCont, FP_HOR_RES, FP_VER_RES / 10);
    lv_obj_align(TitleCont, Win, LV_ALIGN_IN_TOP_MID, 0, 0);

    UI_ObjAlign_Info_t AlignInfo;
    memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t));
#if 0
    AlignInfo.Align                 = LV_ALIGN_IN_TOP_LEFT;
    ReminderDesc->TitleLabelL.Label = UI_Normal_Label_Create(Win, &(ReminderDesc->TitleLabelL),
        FP_HOR_RES / 2, FP_VER_RES / 16,
        &AlignInfo);

    AlignInfo.Align                 = LV_ALIGN_IN_TOP_RIGHT;
    ReminderDesc->TitleLabelR.Label = UI_Normal_Label_Create(Win, &(ReminderDesc->TitleLabelR),
        FP_HOR_RES / 2, FP_VER_RES / 16,
        &AlignInfo);
#else
    ReminderDesc->TitleLabelL.Label = lv_label_create(TitleCont, NULL);
    ReminderDesc->TitleLabelR.Label = lv_label_create(TitleCont, NULL);
#endif

    lv_obj_t *Cont = lv_cont_create(Win, NULL);
    lv_obj_set_size(Cont, FP_HOR_RES, FP_VER_RES / 16);
#if 0
    lv_obj_align(Cont, ReminderDesc->TitleLabelL.Label, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10);
#else
    lv_obj_align(Cont, TitleCont, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0);
#endif
    lv_obj_set_style_local_bg_color(Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT,
                                    LV_COLOR_MAKE(0x50,0x50,0x50));
    lv_obj_set_style_local_bg_opa(Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_80);

    AlignInfo.RefObj              = Cont;
    AlignInfo.x                   = 6;
    AlignInfo.Align               = LV_ALIGN_OUT_BOTTOM_LEFT;
    ReminderDesc->ContLabel.Label = UI_Normal_Label_Create(Win, &(ReminderDesc->ContLabel),
        FP_HOR_RES,FP_VER_RES / 16, &AlignInfo);

    UI_Normal_KeyFunc_Set(ReminderDesc->KeyFunc);
    UI_Normal_Group_Create(ReminderDesc->TitleLabelL.Label, NULL, NULL);

    UI_Normal_ButtonBar_Create(&(ReminderDesc->ButtonCont), Win);
} /* UI_Normal_Reminder_Create */


/**
 * Creat Normal_Switch_Off
 * param (in) NormalSwitchOffDesc: UI_Normal_Switch_Off_Desc_t*
 * return  VOID
 */
VOID UI_Normal_Switch_Off_Create(VOID *NormalSwitchOffDesc)
{
    if (NormalSwitchOffDesc == NULL)
    {
        return;
    }
    UI_Normal_Container_List_Desc_t *SwitchOffDesc =
        (UI_Normal_Container_List_Desc_t *)NormalSwitchOffDesc;

    lv_obj_t *Win = UI_Normal_Win_Create(FALSE, NULL);

    lv_obj_t *List = lv_list_create(Win,NULL);
    lv_obj_set_size(List, FP_HOR_RES, FP_CONT_BAR_H);
    lv_obj_set_pos(List, 0, FP_TITLE_BAR_H);
    UI_Normal_Group_Create(List, NULL, NULL);
    SwitchOffDesc->List = List;

    UI_Normal_ContList_Add(List, &(SwitchOffDesc->ContList.ContainerList[0]),
        SwitchOffDesc->ContList.Index);
    UI_Normal_ContList_Add(List, &(SwitchOffDesc->ContList.ContainerList[1]),
        SwitchOffDesc->ContList.Index);

    UI_Normal_KeyFunc_Set(SwitchOffDesc->KeyFunc);
    UI_Normal_ButtonBar_Create(&(SwitchOffDesc->ButtonBar), Win);
}


/**
 * Creat Normal_Menu
 * param (in) NormalMenuDesc: UI_Normal_Menu_Desc_t*
 * return  VOID
 */
VOID UI_Normal_Menu_Create(VOID *NormalMenuDesc)
{
    if (NormalMenuDesc == NULL)
    {
        return;
    }

    UINT8                 i = 0;
    lv_obj_t              *Icon_Img;

    UI_Normal_Menu_Desc_t *MenuDesc = (UI_Normal_Menu_Desc_t *)NormalMenuDesc;

    lv_obj_t              *Win = UI_Normal_Win_Create(TRUE, &(MenuDesc->TitleBar));
    lv_win_set_scrollbar_mode(Win, LV_SCROLLBAR_MODE_HIDE);

    if (0 < MenuDesc->PageMultiButton.ListButtonCnt)
    {
        lv_obj_t *Page = lv_page_create(Win, NULL);
        lv_obj_set_style_local_pad_top(Page, LV_PAGE_PART_BG, LV_STATE_DEFAULT, 0);
        lv_obj_set_style_local_pad_bottom(Page, LV_PAGE_PART_BG, LV_STATE_DEFAULT, 0);
        lv_obj_set_style_local_pad_left(Page, LV_PAGE_PART_SCROLLABLE, LV_STATE_DEFAULT, 0);
        lv_obj_set_style_local_pad_right(Page, LV_PAGE_PART_SCROLLABLE, LV_STATE_DEFAULT, 0);
        lv_obj_set_style_local_pad_top(Page, LV_PAGE_PART_SCROLLABLE, LV_STATE_DEFAULT, 0);
        lv_obj_set_style_local_pad_bottom(Page, LV_PAGE_PART_SCROLLABLE, LV_STATE_DEFAULT, 0);

        lv_page_set_scrollable_fit2(Page, LV_FIT_NONE, LV_FIT_TIGHT);
        lv_page_set_scrl_layout(Page, LV_LAYOUT_GRID);
        lv_coord_t ScrlPadInner = lv_obj_get_style_pad_inner(Page, LV_PAGE_PART_SCROLLABLE);
        lv_coord_t BtnOneLineW = FP_MENU_ICON_W * 3 + ScrlPadInner * 2;
        lv_obj_set_size(Page, FP_HOR_RES, BtnOneLineW + ScrlPadInner);
        lv_page_set_scrl_width(Page, BtnOneLineW + ScrlPadInner);
        lv_obj_align(Page, Win, LV_ALIGN_CENTER, 0, 0);
        lv_coord_t PadHor = (FP_HOR_RES - BtnOneLineW) / 2 - 1;
        lv_obj_set_style_local_pad_left(Page, LV_PAGE_PART_BG, LV_STATE_DEFAULT, PadHor);
        lv_obj_set_style_local_pad_right(Page, LV_PAGE_PART_BG, LV_STATE_DEFAULT, PadHor - ScrlPadInner - 1);

        for (i = 0; i < MenuDesc->PageMultiButton.ListButtonCnt; i++)
        {
            MenuDesc->PageMultiButton.ButtonList[i].Button = lv_btn_create(Page, NULL);
            lv_obj_set_size(MenuDesc->PageMultiButton.ButtonList[i].Button, FP_MENU_ICON_W,
                            FP_MENU_ICON_W);
            lv_obj_set_style_local_radius(MenuDesc->PageMultiButton.ButtonList[i].Button,
                                          LV_BTN_PART_MAIN, LV_STATE_PRESSED, 15);
            lv_obj_set_style_local_border_width(MenuDesc->PageMultiButton.ButtonList[i].Button,
                                                LV_BTN_PART_MAIN, LV_STATE_PRESSED, FP_HOR_RES / 30);
            lv_obj_set_style_local_border_color(MenuDesc->PageMultiButton.ButtonList[i].Button,
                                                LV_BTN_PART_MAIN, LV_STATE_PRESSED,
                                                LV_COLOR_MAKE(0x60, 0xC0, 0xFF));

            Icon_Img = lv_img_create(MenuDesc->PageMultiButton.ButtonList[i].Button, NULL);
            lv_img_set_src(Icon_Img, MenuDesc->PageMultiButton.ButtonList[i].Icon);
            lv_obj_add_style(Icon_Img, LV_IMG_PART_MAIN, &img_light);
            lv_obj_set_event_cb(MenuDesc->PageMultiButton.ButtonList[i].Button,
                                MenuDesc->PageMultiButton.ButtonList[i].ReleaseFun);
        }
        UINT8 FocusOnBtn = MenuDesc->PageMultiButton.FocusOnBtn;
        if (MenuDesc->PageMultiButton.ListButtonCnt <= MenuDesc->PageMultiButton.FocusOnBtn)
        {
            FocusOnBtn = 0;
        }
        lv_btn_set_state(MenuDesc->PageMultiButton.ButtonList[FocusOnBtn].Button,
                         LV_BTN_STATE_PRESSED);

        MenuDesc->PageMultiButton.Page = Page;
    }

    UI_Normal_KeyFunc_Set(MenuDesc->KeyFunc);
    UI_Normal_Group_Create(MenuDesc->PageMultiButton.Page, NULL, NULL);

    UI_Normal_ButtonBar_Create(&(MenuDesc->ButtonBar), Win);
} /* UI_Normal_Menu_Create */


/**
 * Creat Desktop_Unlock
 * param (in) DesktopUnlockDesc: UI_Desktop_Unlock_Desc_t*
 * return  VOID
 */
VOID UI_Desktop_Unlock_Create(VOID *DesktopUnlockDesc)
{
    if (DesktopUnlockDesc == NULL)
    {
        return;
    }
    UI_Desktop_Unlock_Desc_t *UnlockDesc = (UI_Desktop_Unlock_Desc_t *)DesktopUnlockDesc;

    lv_obj_t                 *Win = UI_Normal_Win_Create(FALSE, NULL);
    lv_win_set_scrollbar_mode(Win, LV_SCROLLBAR_MODE_HIDE);

    lv_obj_t *Wallpaper_Img = lv_img_create(Win, NULL);
    lv_obj_set_size(Wallpaper_Img, FP_HOR_RES, FP_VER_RES);
    lv_obj_align(Wallpaper_Img, Win, LV_ALIGN_CENTER, 0, 0);
    lv_img_set_auto_size(Wallpaper_Img, FALSE);
    lv_img_set_src(Wallpaper_Img, UnlockDesc->Wall_Paper_Img);

    UI_ObjAlign_Info_t AlignInfo;
    memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t));
    AlignInfo.Align                = LV_ALIGN_IN_TOP_LEFT;
    AlignInfo.y                    = FP_VER_RES / 16;
    UnlockDesc->ContLabel[0].Label =
        UI_Normal_Label_Create(Wallpaper_Img, &(UnlockDesc->ContLabel[0]),FP_HOR_RES,FP_VER_RES / 4,
            &AlignInfo);
    lv_obj_add_style(UnlockDesc->ContLabel[0].Label, LV_LABEL_PART_MAIN, &label_sec);
    lv_obj_set_style_local_text_font(UnlockDesc->ContLabel[0].Label, LV_LABEL_PART_MAIN,
                                     LV_STATE_DEFAULT, UnlockDesc->ContLabel[0].TxtFont);

    AlignInfo.Align                = LV_ALIGN_OUT_BOTTOM_LEFT;
    AlignInfo.RefObj               = UnlockDesc->ContLabel[0].Label;
    AlignInfo.y                    = 0;
    UnlockDesc->ContLabel[1].Label =
        UI_Normal_Label_Create(Wallpaper_Img, &(UnlockDesc->ContLabel[1]),FP_HOR_RES,FP_VER_RES / 6,
            &AlignInfo);

    UI_Normal_KeyFunc_Set(UnlockDesc->KeyFunc);
    UI_Normal_ButtonBar_Create(&(UnlockDesc->ButtonBar), Win);
    UI_Normal_Group_Create(Win, NULL, NULL);
}


/**
 * Creat Status
 * param (in) StatusDesc: UI_Status_Desc_t*
 * return  VOID
 */
VOID UI_Status_Create(VOID *StatusDesc)
{
    if (StatusDesc == NULL)
    {
        return;
    }
    UI_Status_Desc_t   *StaDesc = (UI_Status_Desc_t *)StatusDesc;

    lv_obj_t           *Win = UI_Normal_Win_Create(FALSE, NULL);

    UI_ObjAlign_Info_t AlignInfo;
    memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t));
    AlignInfo.Align          = StaDesc->ContLabelAlign;
    AlignInfo.y              = FP_TITLE_BAR_H;
    StaDesc->ContLabel.Label = UI_Normal_Label_Create(Win, &(StaDesc->ContLabel),FP_HOR_RES,
        FP_VER_RES / 2,&AlignInfo);

    if (StaDesc->ContImg.Img)
    {
        lv_obj_t *ContImg = lv_img_create(Win, NULL);
        if (StaDesc->ContImgAlign == LV_ALIGN_IN_BOTTOM_LEFT)
        {
            lv_obj_align(ContImg, Win, StaDesc->ContImgAlign,
                         lv_obj_get_style_pad_left(StaDesc->ContLabel.Label, LV_LABEL_PART_MAIN),
                          -FP_BUTTON_BAR_H);
        }
        else
        {
            lv_obj_set_width(StaDesc->ContLabel.Label,  (FP_HOR_RES * 2) / 3);
            lv_obj_align(ContImg, StaDesc->ContLabel.Label, LV_ALIGN_OUT_RIGHT_MID, FP_HOR_RES / 10,
                0);
        }

        lv_img_set_src(ContImg, StaDesc->ContImg.Img);
        lv_obj_add_style(ContImg, LV_IMG_PART_MAIN, &img_light);
    }

    UI_Normal_KeyFunc_Set(StaDesc->KeyFunc);
    UI_Normal_Group_Create(Win, NULL, NULL);
}


/**
 * Creat Status_Label
 * param (in) StatusLblDesc: UI_Status_Label_Desc_t*
 * return  VOID
 */
VOID UI_Status_Label_Create(VOID *StatusLblDesc)
{
    if (StatusLblDesc == NULL)
    {
        return;
    }
    UI_Status_Label_Desc_t *StaLblDesc = (UI_Status_Label_Desc_t *)StatusLblDesc;

    lv_obj_t               *Win = UI_Normal_Win_Create(FALSE, NULL);

    UI_ObjAlign_Info_t AlignInfo;
    memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t));
    AlignInfo.Align                = LV_ALIGN_IN_TOP_LEFT;
    AlignInfo.RefObj               = Win;
    AlignInfo.y                    = FP_TITLE_BAR_H;
    StaLblDesc->ContLabel[0].Label = UI_Normal_Label_Create(Win, &(StaLblDesc->ContLabel[0]),
        FP_HOR_RES, FP_VER_RES / 3, &AlignInfo);
    if (StaLblDesc->ContLabel[0].ImgSrc)
    {
        lv_cont_set_fit2(lv_obj_get_parent(StaLblDesc->ContLabel[0].Label), FALSE, TRUE);
    }

    AlignInfo.Align                = LV_ALIGN_IN_LEFT_MID;
    AlignInfo.y                    = 0;
    StaLblDesc->ContLabel[1].Label = UI_Normal_Label_Create(Win, &(StaLblDesc->ContLabel[1]),
        FP_HOR_RES, FP_TITLE_BAR_H, &AlignInfo);

    UI_Normal_KeyFunc_Set(StaLblDesc->KeyFunc);
    UI_Normal_Group_Create(Win, NULL, NULL);
}


/**
 * Creat Normal_NoTitle
 * param (in) NormalNoTitleDesc: UI_Normal_NoTitle_Desc_t*
 * return  VOID
 */
VOID UI_Normal_NoTitle_Create(VOID *NormalNoTitleDesc)
{
    if (NormalNoTitleDesc == NULL)
    {
        return;
    }
    UI_Normal_NoTitle_Desc_t *NoTitleDesc = (UI_Normal_NoTitle_Desc_t *)NormalNoTitleDesc;

    lv_obj_t                 *Win = UI_Normal_Win_Create(FALSE, NULL);
    lv_win_set_scrollbar_mode(Win,LV_SCROLLBAR_MODE_HIDE);

    lv_obj_t *Cont = lv_cont_create(Win, NULL);
    lv_obj_set_size(Cont, FP_HOR_RES, FP_CONT_BAR_H);
    lv_obj_set_pos(Cont, 0, FP_TITLE_BAR_H);

    UI_ObjAlign_Info_t AlignInfo;
    memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t));
    AlignInfo.Align                         = LV_ALIGN_IN_TOP_LEFT;
    NoTitleDesc->ContenCont.ContLabel.Label =
        UI_Normal_Label_Create(Cont, &(NoTitleDesc->ContenCont.ContLabel), FP_HOR_RES,
            FP_CONT_BAR_H / 2,&AlignInfo);

    if (NoTitleDesc->ContenCont.ContImg.Img)
    {
        lv_obj_t *Img = lv_img_create(Cont, NULL);

        if (NoTitleDesc->ContenCont.ContImg.ImgAlign == LV_ALIGN_IN_BOTTOM_LEFT)
        {
            lv_obj_align(Img, NULL, NoTitleDesc->ContenCont.ContImg.ImgAlign,
                         lv_obj_get_style_pad_left(NoTitleDesc->ContenCont.ContLabel.Label,
                                                   LV_LABEL_PART_MAIN),
                         0);
        }
        else
        {
            lv_obj_set_width(NoTitleDesc->ContenCont.ContLabel.Label,  FP_HOR_RES * 2 / 3);
            lv_obj_align(Img,  NoTitleDesc->ContenCont.ContLabel.Label, LV_ALIGN_OUT_RIGHT_TOP,// LV_ALIGN_OUT_RIGHT_MID,
                FP_HOR_RES / 8, 0);
        }

        lv_img_set_src(Img, NoTitleDesc->ContenCont.ContImg.Img);
        lv_obj_add_style(Img, LV_IMG_PART_MAIN, &img_light);
    }

    UI_Normal_ButtonBar_Create(&(NoTitleDesc->ButtonBar), Win);
    UI_Normal_KeyFunc_Set(NoTitleDesc->KeyFunc);
    UI_Normal_Group_Create(Win, NULL, NULL);
} /* UI_Normal_NoTitle_Create */


/**
 * Creat Normal_NoTitle_Label_Ta
 * param (in) NormalNoTitleLblTaDesc: UI_Normal_NoTitle_Label_Ta_Desc_t*
 * return  VOID
 */
VOID UI_Normal_NoTitle_Label_Ta_Create(VOID *NormalNoTitleLblTaDesc)
{
    if (NormalNoTitleLblTaDesc == NULL)
    {
        return;
    }
    UI_Normal_NoTitle_Label_Ta_Desc_t *NoTitleLblTaDesc =
        (UI_Normal_NoTitle_Label_Ta_Desc_t *)NormalNoTitleLblTaDesc;

    lv_obj_t *Win = UI_Normal_Win_Create(FALSE, NULL);
    lv_win_set_scrollbar_mode(Win, LV_SCROLLBAR_MODE_HIDE);

    lv_obj_t *Cont = lv_cont_create(Win, NULL);
    lv_obj_set_size(Cont, FP_HOR_RES, FP_NOTITLE_CONT_BAR_H);
    lv_obj_set_pos(Cont, 0, 0);

    UI_ObjAlign_Info_t AlignInfo;
    memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t));
    /* AlignInfo.Align                     = LV_ALIGN_IN_TOP_LEFT;
     * NoTitleLblTaDesc->ContLabelTl.Label =
     * UI_Normal_Label_Create(Cont,&(NoTitleLblTaDesc->ContLabelTl), 0,0, &AlignInfo);*/

    NoTitleLblTaDesc->ContLabelTr.Label =
        UI_Normal_Label_Create(Cont,&(NoTitleLblTaDesc->ContLabelTr),0, 0, NULL);
    lv_label_set_long_mode(NoTitleLblTaDesc->ContLabelTr.Label, LV_LABEL_LONG_BREAK);
    lv_obj_set_width(NoTitleLblTaDesc->ContLabelTr.Label, FP_HOR_RES / 2);
    lv_obj_align(NoTitleLblTaDesc->ContLabelTr.Label, Cont, LV_ALIGN_IN_TOP_RIGHT, 0, 0);

    AlignInfo.Align                   = LV_ALIGN_IN_TOP_LEFT;
    AlignInfo.y                       = FP_CONT_BAR_H / 4;
    NoTitleLblTaDesc->ContLabel.Label = UI_Normal_Label_Create(Cont, &(NoTitleLblTaDesc->ContLabel),
        FP_HOR_RES, FP_CONT_BAR_H / 2,
        &AlignInfo);

    lv_obj_t *TextArea = lv_textarea_create(Cont, NULL);
    lv_obj_set_size(TextArea, FP_HOR_RES, FP_CONT_BAR_H / 2);
    lv_obj_align(TextArea, NULL, LV_ALIGN_IN_TOP_LEFT, 0, FP_CONT_BAR_H / 2);
    lv_textarea_set_cursor_hidden(TextArea, NoTitleLblTaDesc->ContTa.TaCursorHide);
    if (NoTitleLblTaDesc->ContTa.TaTxt != NULL)
    {
        lv_textarea_set_text(TextArea, NoTitleLblTaDesc->ContTa.TaTxt);
    }
    else
    {
        lv_textarea_set_text(TextArea, "");
    }

    NoTitleLblTaDesc->ContTa.TextArea = TextArea;
    // set Ime
    Ime_Init();
    Ime_Set_Ta(TextArea);

    UI_Normal_Group_Create(NoTitleLblTaDesc->ContTa.TextArea, NULL, NULL);
    UI_Normal_ButtonBar_Create(&(NoTitleLblTaDesc->ButtonCont), Win);
    UI_Normal_KeyFunc_Set(NoTitleLblTaDesc->KeyFunc);
} /* UI_Normal_NoTitle_Label_Ta_Create */


/**
 * Creat Normal_NoTitle_Ta
 * param (in) NormalNoTitleTaDesc: UI_Normal_NoTitle_Ta_Desc_t*
 * return  VOID
 */
VOID UI_Normal_NoTitle_Ta_Create(VOID *NormalNoTitleTaDesc)
{
    if (NormalNoTitleTaDesc == NULL)
    {
        return;
    }

    UI_Normal_NoTitle_Ta_Desc_t *NoTitleTaDesc = (UI_Normal_NoTitle_Ta_Desc_t *)NormalNoTitleTaDesc;

    lv_obj_t                    *Win = UI_Normal_Win_Create(FALSE, NULL);
    lv_win_set_scrollbar_mode(Win,LV_SCROLLBAR_MODE_HIDE);

    lv_obj_t *Cont = lv_cont_create(Win, NULL);
    lv_obj_set_size(Cont, FP_HOR_RES, FP_CONT_BAR_H + FP_TITLE_BAR_H);
    lv_obj_set_pos(Cont, 0, 0);

    UI_ObjAlign_Info_t AlignInfo;
    memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t));
    AlignInfo.Align = LV_ALIGN_IN_TOP_LEFT;
    if (NoTitleTaDesc->ContLabelTl.TxtId == PHONE_TEXT_ID_MEM_STA)
    {
        NoTitleTaDesc->ContLabelTl.Label = UI_Normal_Label_Create(Cont,
            &(NoTitleTaDesc->ContLabelTl),
            FP_HOR_RES, FP_TITLE_BAR_H,
            &AlignInfo);
        lv_obj_add_style(NoTitleTaDesc->ContLabelTl.Label, LV_LABEL_PART_MAIN, &label_prim);
    }
    else
    {
        /*  NoTitleTaDesc->ContLabelTl.Label = UI_Normal_Label_Create(Cont,
         *  &(NoTitleTaDesc->ContLabelTl),
         *  FP_HOR_RES / 2, FP_TITLE_BAR_H,
         *  &AlignInfo);*/

        AlignInfo.Align                  = LV_ALIGN_IN_TOP_RIGHT;
        NoTitleTaDesc->ContLabelTr.Label = UI_Normal_Label_Create(Cont,
            &(NoTitleTaDesc->ContLabelTr),
            FP_HOR_RES / 3, FP_TITLE_BAR_H,
            &AlignInfo);
        lv_obj_add_style(NoTitleTaDesc->ContLabelTr.Label, LV_LABEL_PART_MAIN, &label_prim);
    }

    lv_obj_t *TextArea = lv_textarea_create(Cont, NULL);
    lv_obj_set_size(TextArea, FP_HOR_RES, FP_CONT_BAR_H);
    lv_obj_align(TextArea, NULL, LV_ALIGN_IN_TOP_LEFT, 0, FP_TITLE_BAR_H);
    lv_textarea_set_cursor_hidden(TextArea, NoTitleTaDesc->ContTa.TaCursorHide);
    if (NoTitleTaDesc->ContTa.TaTxt)
    {
        lv_textarea_set_text(TextArea,NoTitleTaDesc->ContTa.TaTxt);
    }
    else
    {
        lv_textarea_set_text(TextArea,"");
    }

    NoTitleTaDesc->ContTa.TextArea = TextArea;
    if (NoTitleTaDesc->ContLabelTl.TxtId != PHONE_TEXT_ID_MEM_STA)
    {
        Ime_Init();
        Ime_Set_Ta(TextArea);
    }

    UI_Normal_Group_Create(NoTitleTaDesc->ContTa.TextArea,NULL,NULL);
    UI_Normal_ButtonBar_Create(&(NoTitleTaDesc->ButtonBar), Win);
    UI_Normal_KeyFunc_Set(NoTitleTaDesc->KeyFunc);
} /* UI_Normal_NoTitle_Ta_Create */


/**
 * Creat Normal_Sms_Insert_Symbol
 * param (in) NormalSmsInsertSymbolDesc: UI_Normal_Sms_Insert_Symbol_Desc_t*
 * return  VOID
 */
VOID UI_Normal_Sms_Insert_Symbol_Create(VOID *NormalSmsInsertSymbolDesc)
{
    if (NormalSmsInsertSymbolDesc == NULL)
    {
        return;
    }
    UI_Normal_Sms_Insert_Symbol_Desc_t *SmsInsertSymbolDesc =
        ( UI_Normal_Sms_Insert_Symbol_Desc_t *)NormalSmsInsertSymbolDesc;

    lv_obj_t *Win = UI_Normal_Win_Create(FALSE, NULL);

    lv_obj_t *Cont = lv_cont_create(Win, NULL);
    lv_obj_set_size(Cont, FP_HOR_RES, FP_CONT_BAR_H + FP_TITLE_BAR_H);
    lv_obj_set_pos(Cont, 0, 0);

    UI_ObjAlign_Info_t AlignInfo;
    memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t));
    AlignInfo.Align                      = LV_ALIGN_IN_TOP_LEFT;
    SmsInsertSymbolDesc->ContLabel.Label =
        UI_Normal_Label_Create(Cont,&(SmsInsertSymbolDesc->ContLabel),FP_HOR_RES / 2,FP_TITLE_BAR_H,
            &AlignInfo);

    lv_obj_t *Btnm = lv_btnmatrix_create(Cont, NULL);
    lv_obj_set_size(Btnm, FP_HOR_RES, FP_CONT_BAR_H);
    lv_obj_align(Btnm, NULL, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0);
    lv_btnmatrix_set_map(Btnm, (const INT8 **)SmsInsertSymbolDesc->ContBtnm.BtnmTxt);
    lv_obj_set_event_cb(Btnm, SmsInsertSymbolDesc->ContBtnm.ReleaseFun);
    SmsInsertSymbolDesc->ContBtnm.ButtonMatrix = Btnm;

    UI_Normal_Group_Create(Btnm, NULL, NULL);
    UI_Normal_ButtonBar_Create(&(SmsInsertSymbolDesc->ButtonBar), Win);
    UI_Normal_KeyFunc_Set(SmsInsertSymbolDesc->KeyFunc);
}


/**
 * Creat Normal_Calculator
 * param (in) NormalCalDesc: UI_Normal_Calculator_Desc_t*
 * return  VOID
 */
VOID UI_Normal_Calculator_Create(VOID *NormalCalDesc)
{
    if (NormalCalDesc == NULL)
    {
        return;
    }
    UI_Normal_Calculator_Desc_t *CalDesc = (UI_Normal_Calculator_Desc_t *)NormalCalDesc;

    lv_obj_t                    *Win = UI_Normal_Win_Create(FALSE, NULL);
    lv_win_set_scrollbar_mode(Win,LV_SCROLLBAR_MODE_HIDE);

    lv_obj_t *Cont = lv_cont_create(Win,NULL);
    lv_obj_set_size(Cont, FP_HOR_RES, FP_CONT_BAR_H / 2);
    lv_obj_set_style_local_bg_color(Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT,
                                    LV_COLOR_MAKE(0x60,0xC0,0xFF));

    UI_ObjAlign_Info_t AlignInfo;
    memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t));
    AlignInfo.Align             = LV_ALIGN_IN_TOP_LEFT;
    AlignInfo.x                 = FP_HOR_RES / 7;
    AlignInfo.y                 = 6;
    CalDesc->FactorLabel1.Label = UI_Normal_Label_Create(Cont, &(CalDesc->FactorLabel1),
        FP_HOR_RES * 5 / 6,FP_CONT_BAR_H / 6,
        &AlignInfo);

    lv_coord_t PadHor = lv_obj_get_style_pad_left(CalDesc->FactorLabel1.Label, LV_LABEL_PART_MAIN);
    AlignInfo.x                 = PadHor;
    AlignInfo.y                 = FP_CONT_BAR_H / 6;
    CalDesc->SymbolLabel1.Label = UI_Normal_Label_Create(Cont, &(CalDesc->SymbolLabel1),
        FP_HOR_RES / 7,FP_CONT_BAR_H / 6,
        &AlignInfo);
    AlignInfo.x                 = FP_HOR_RES / 7;
    AlignInfo.y                 = FP_CONT_BAR_H / 6;
    CalDesc->FactorLabel2.Label = UI_Normal_Label_Create(Cont, &(CalDesc->FactorLabel2),
        FP_HOR_RES * 5 / 6,FP_CONT_BAR_H / 6,
        &AlignInfo);

    AlignInfo.x                 = PadHor;
    AlignInfo.y                 = FP_CONT_BAR_H / 3;
    CalDesc->SymbolLabel2.Label = UI_Normal_Label_Create(Cont, &(CalDesc->SymbolLabel2),
        FP_HOR_RES / 7,FP_CONT_BAR_H / 6,
        &AlignInfo);
    lv_obj_t *Input_Ta = lv_textarea_create(Cont, NULL);
    lv_obj_set_size(Input_Ta, FP_HOR_RES * 5 / 6, FP_CONT_BAR_H / 6);
    lv_obj_align(Input_Ta, NULL, LV_ALIGN_IN_TOP_LEFT, FP_HOR_RES / 7, FP_CONT_BAR_H / 3);
    lv_textarea_set_cursor_hidden(Input_Ta, CalDesc->ContTa.TaCursorHide);
    lv_textarea_set_accepted_chars(Input_Ta, "-.0123456789");
    lv_page_set_scrollbar_mode(Input_Ta, LV_SCROLLBAR_MODE_OFF);
    if (CalDesc->ContTa.TaTxt != NULL)
    {
        lv_textarea_set_text(Input_Ta, CalDesc->ContTa.TaTxt);
    }
    else
    {
        lv_textarea_set_text(Input_Ta, "0");
    }

    lv_textarea_set_text_align(Input_Ta, LV_LABEL_ALIGN_RIGHT);
    lv_obj_set_style_local_bg_color(Input_Ta, LV_TEXTAREA_PART_BG, LV_STATE_DEFAULT,
                                    LV_COLOR_MAKE(0x60,0xC0,0xFF));
    lv_obj_set_style_local_text_color(Input_Ta, LV_TEXTAREA_PART_BG, LV_STATE_DEFAULT,
                                      LV_COLOR_WHITE);
    lv_obj_set_style_local_border_width(Input_Ta, LV_TEXTAREA_PART_BG, LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_text_font(Input_Ta, LV_TEXTAREA_PART_BG, LV_STATE_DEFAULT,
                                     LV_FONT_PTR_DRIODSANSFALLBACKFULL_LARGE);

    CalDesc->ContTa.TextArea = Input_Ta;

    lv_obj_t *Oper_Cont = lv_cont_create(Win, NULL);
    lv_obj_set_size(Oper_Cont,  FP_CONT_BAR_H / 2, FP_CONT_BAR_H / 2);
    lv_obj_set_pos(Oper_Cont, (FP_HOR_RES - FP_CONT_BAR_H / 2) / 2,
        FP_CONT_BAR_H / 2 + FP_TITLE_BAR_H / 2);
    lv_obj_set_style_local_radius(Oper_Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 100);
    lv_obj_set_style_local_bg_color(Oper_Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT,
                                    LV_COLOR_MAKE(0x40,0x40,0x40));
    lv_obj_set_style_local_bg_opa(Oper_Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_60);

    AlignInfo.Align                     = LV_ALIGN_IN_TOP_MID;
    AlignInfo.x                         = 0;
    AlignInfo.y                         = 0;
    CalDesc->ContLabel.ContLabelU.Label =
        UI_Normal_Label_Create(Oper_Cont,&(CalDesc->ContLabel.ContLabelU), 0, 0, &AlignInfo);

    AlignInfo.Align                     = LV_ALIGN_IN_LEFT_MID;
    CalDesc->ContLabel.ContLabelL.Label =
        UI_Normal_Label_Create(Oper_Cont,&(CalDesc->ContLabel.ContLabelL), 0, 0, &AlignInfo);

    AlignInfo.Align                     = LV_ALIGN_IN_RIGHT_MID;
    CalDesc->ContLabel.ContLabelR.Label =
        UI_Normal_Label_Create(Oper_Cont,&(CalDesc->ContLabel.ContLabelR), 0, 0, &AlignInfo);

    AlignInfo.Align                     = LV_ALIGN_IN_BOTTOM_MID;
    CalDesc->ContLabel.ContLabelD.Label =
        UI_Normal_Label_Create(Oper_Cont,&(CalDesc->ContLabel.ContLabelD), 0, 0, &AlignInfo);

    UI_Normal_Group_Create(Input_Ta, NULL, NULL);
    UI_Normal_ButtonBar_Create(&(CalDesc->ButtonBar), Win);
    UI_Normal_KeyFunc_Set(CalDesc->KeyFunc);
} /* UI_Normal_Calculator_Create */


/**
 * Creat Normal_Reminder_Alarm
 * param (in) NormalReminderAlarmDesc: UI_Normal_Reminder_Alarm_Desc_t*
 * return  VOID
 */
VOID UI_Normal_Reminder_Alarm_Create(VOID *NormalReminderAlarmDesc)
{
    if (NormalReminderAlarmDesc == NULL)
    {
        return;
    }
    UI_Normal_Reminder_Alarm_Desc_t *ReminderAlarmDesc =
        (UI_Normal_Reminder_Alarm_Desc_t *)NormalReminderAlarmDesc;
    lv_obj_t                        *Win = UI_Normal_Win_Create(FALSE, NULL);
    lv_win_set_scrollbar_mode(Win, LV_SCROLLBAR_MODE_HIDE);

    lv_obj_t *Img = lv_img_create(Win, NULL);
    lv_img_set_src(Img, ReminderAlarmDesc->ContImg.Img);

    UI_ObjAlign_Info_t AlignInfo;
    memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t));
    AlignInfo.Align                     = LV_ALIGN_OUT_RIGHT_TOP;
    AlignInfo.RefObj                    = Img;
    AlignInfo.x                         = FP_HOR_RES / 10;
    ReminderAlarmDesc->ContLabelR.Label =
        UI_Normal_Label_Create(Win, &(ReminderAlarmDesc->ContLabelR),(FP_HOR_RES * 2) / 3,
            FP_VER_RES / 8, &AlignInfo);

    lv_coord_t PadHor = lv_obj_get_style_pad_left(ReminderAlarmDesc->ContLabelR.Label,
                                                  LV_LABEL_PART_MAIN);
    lv_obj_align(Img, NULL, LV_ALIGN_IN_TOP_LEFT, PadHor * 2, 0);

    AlignInfo.Align                     = LV_ALIGN_OUT_BOTTOM_LEFT;
    AlignInfo.x                         = 0;
    AlignInfo.y                         = FP_VER_RES / 20;
    ReminderAlarmDesc->ContLabelD.Label =
        UI_Normal_Label_Create(Win, &(ReminderAlarmDesc->ContLabelD),FP_HOR_RES, FP_VER_RES / 2,
            &AlignInfo);

    UI_Normal_ButtonBar_Create(&(ReminderAlarmDesc->ButtonBar), Win);
    UI_Normal_KeyFunc_Set(ReminderAlarmDesc->KeyFunc);
    UI_Normal_Group_Create(Win, NULL, NULL);
}


/**
 * Creat Normal_NoTitle_Labels_Bar
 * param (in) NormalNoTitleLblsBarDesc: UI_Normal_NoTitle_Labels_Bar_Desc_t*
 * return  VOID
 */
VOID UI_Normal_NoTitle_Labels_Bar_Create(VOID *NormalNoTitleLblsBarDesc)
{
    if (NormalNoTitleLblsBarDesc == NULL)
    {
        return;
    }
    UI_Normal_NoTitle_Labels_Bar_Desc_t *NoTitleLblsBarDesc =
        (UI_Normal_NoTitle_Labels_Bar_Desc_t *)NormalNoTitleLblsBarDesc;

    lv_obj_t *Win = UI_Normal_Win_Create(FALSE, NULL);
    lv_win_set_scrollbar_mode(Win,LV_SCROLLBAR_MODE_HIDE);

    UI_ObjAlign_Info_t AlignInfo;
    memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t));
    AlignInfo.RefObj = Win;

    UINT8 i = 0;
    lv_coord_t Height;
    for (i = 0; i < 4; i++)
    {
        if (  NoTitleLblsBarDesc->ContLabel[i].ImgSrc == NULL
           && NoTitleLblsBarDesc->ContLabel[i].SymbolId == NULL)
        {
            lv_img_header_t img_header;
            lv_img_decoder_get_info(IMG_CALL_CALLING, &img_header);

            AlignInfo.x = img_header.w + LV_DPI / 6;
        }
        else
        {
            AlignInfo.x = 0;
        }
        if (i == 3)
        {
            AlignInfo.Align = LV_ALIGN_IN_LEFT_MID;
            AlignInfo.y     = 0;
            Height          = FP_TITLE_BAR_H;
        }
        else
        {
            AlignInfo.Align = LV_ALIGN_IN_TOP_LEFT;
            AlignInfo.y     = FP_TITLE_BAR_H + FP_CONT_BAR_H * i / 8;
            Height          = FP_CONT_BAR_H / 5;
        }
        NoTitleLblsBarDesc->ContLabel[i].Label =
            UI_Normal_Label_Create(Win, &(NoTitleLblsBarDesc->ContLabel[i]),
                                   FP_HOR_RES - AlignInfo.x, Height, &AlignInfo);
        if (NoTitleLblsBarDesc->ContLabel[i].ImgSrc)
        {
            lv_cont_set_fit2(lv_obj_get_parent(NoTitleLblsBarDesc->ContLabel[i].Label), FALSE, TRUE);
        }
    }

    lv_obj_t *VolBar = lv_slider_create(Win, NULL);
    lv_obj_set_size(VolBar, FP_HOR_RES * 4 / 5,  FP_TITLE_BAR_H * 2 / 3);
    lv_obj_set_style_local_pad_left(VolBar, LV_BAR_PART_BG, LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_pad_right(VolBar, LV_BAR_PART_BG, LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_pad_top(VolBar, LV_BAR_PART_BG, LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_pad_bottom(VolBar, LV_BAR_PART_BG, LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_bg_opa(VolBar, LV_BAR_PART_INDIC, LV_STATE_DEFAULT, LV_OPA_COVER);
    lv_obj_set_style_local_pad_left(VolBar, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, LV_DPI / 12);
    lv_obj_set_style_local_pad_right(VolBar, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, LV_DPI / 12);
    lv_obj_set_style_local_pad_top(VolBar, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, LV_DPI / 12);
    lv_obj_set_style_local_pad_bottom(VolBar, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, LV_DPI / 12);
    lv_obj_align(VolBar, Win, LV_ALIGN_IN_BOTTOM_MID, 0, -FP_BUTTON_BAR_H - FP_TITLE_BAR_H / 3);
    lv_slider_set_range(VolBar, 1, NoTitleLblsBarDesc->Bar.Range);
    lv_slider_set_value(VolBar, NoTitleLblsBarDesc->Bar.Value, LV_ANIM_OFF);
    NoTitleLblsBarDesc->Bar.Bar = VolBar;

    UI_Normal_ButtonBar_Create(&(NoTitleLblsBarDesc->ButtonBar), Win);
    UI_Normal_KeyFunc_Set(NoTitleLblsBarDesc->KeyFunc);
    UI_Normal_Group_Create(VolBar, NULL, NULL);
} /* UI_Normal_NoTitle_Labels_Bar_Create */


/**
 * Creat FullScreen_Label_Only
 * param (in) FullScrnLblOnlyDesc: UI_FullScreen_Label_Only_Desc_t*
 * return  VOID
 */
VOID UI_FullScreen_Label_Only_Create(VOID *FullScrnLblOnlyDesc)
{
    if (FullScrnLblOnlyDesc == NULL)
    {
        return;
    }
    UI_FullScreen_Label_Only_Desc_t *FullLblOnlyDesc =
        (UI_FullScreen_Label_Only_Desc_t *)FullScrnLblOnlyDesc;

    lv_obj_t *Win = UI_Normal_FullScreen_Win_Create();

    lv_obj_t *Cont = lv_cont_create(Win, NULL);
    lv_obj_set_size(Cont, FP_HOR_RES, FP_VER_RES);
    lv_cont_set_layout(Cont, LV_LAYOUT_CENTER);

    FullLblOnlyDesc->ContLabel.Label = UI_Normal_Label_Create(Cont, &(FullLblOnlyDesc->ContLabel),
        FP_HOR_RES, 0, NULL);
    UI_Normal_KeyFunc_Set(FullLblOnlyDesc->KeyFunc);
    UI_Normal_Group_Create(Cont, NULL,NULL);
}


/**
 * Creat FullScreen_Label
 * param (in) FullScrnLblDesc: UI_FullScreen_Label_Desc_t*
 * return  VOID
 */
VOID UI_FullScreen_Label_Create(VOID *FullScrnLblDesc)
{
    if (FullScrnLblDesc == NULL)
    {
        return;
    }
    UI_FullScreen_Label_Desc_t *FullLblDesc = (UI_FullScreen_Label_Desc_t *)FullScrnLblDesc;

    lv_obj_t                   *Win = UI_Normal_FullScreen_Win_Create();

    lv_obj_t                   *Cont = lv_cont_create(Win, NULL);
    lv_obj_set_size(Cont, FP_HOR_RES, FP_VER_RES);
    lv_cont_set_layout(Cont, LV_LAYOUT_CENTER);

    FullLblDesc->BatteryLabel.Label = UI_Normal_Label_Create(Cont, &(FullLblDesc->BatteryLabel), 0,
        0,NULL);

    UI_Normal_KeyFunc_Set(FullLblDesc->KeyFunc);
    UI_Normal_Group_Create(Cont, NULL, NULL);
}


/**
 * Creat Calendar
 * param (in) CalendarDesc: UI_Calendar_Only_Desc_t*
 * return  VOID
 */
VOID UI_Calendar_Create(VOID *CalendarDesc)
{
    if (CalendarDesc == NULL)
    {
        return;
    }

    UI_Calendar_Only_Desc_t *CalDesc = (UI_Calendar_Only_Desc_t *)CalendarDesc;

    lv_obj_t                *Win = UI_Normal_FullScreen_Win_Create();

    lv_obj_t                *Calendar = lv_calendar_create(Win, NULL);
    lv_obj_set_size(Calendar, FP_HOR_RES, FP_VER_RES - FP_BUTTON_BAR_H);
    lv_obj_align(Calendar, Win, LV_ALIGN_IN_TOP_MID, 0, 0);
    UI_Set_User_Ptr(Calendar, CalDesc->Calendar.ShowedDateInfoCb);

    lv_coord_t       BgPadTop = lv_obj_get_style_pad_top(Calendar, LV_CALENDAR_PART_BG);
    lv_coord_t       BgPadBottom = lv_obj_get_style_pad_bottom(Calendar, LV_CALENDAR_PART_BG);
    lv_coord_t       BgPadLeft = lv_obj_get_style_pad_left(Calendar, LV_CALENDAR_PART_BG);
    lv_coord_t       BgPadRight = lv_obj_get_style_pad_right(Calendar, LV_CALENDAR_PART_BG);
    const lv_font_t  *HeaderFont = lv_obj_get_style_text_font(Calendar, LV_CALENDAR_PART_HEADER);
    lv_coord_t       HeaderHeight = lv_font_get_line_height(HeaderFont);

    lv_obj_t        *DayBg = lv_cont_create(Calendar, NULL);
    const lv_font_t *DayFont = lv_obj_get_style_text_font(Calendar, LV_CALENDAR_PART_DAY_NAMES);
    UINT16           DayH = lv_font_get_line_height(DayFont) + BgPadTop;
    lv_obj_set_size(DayBg, FP_HOR_RES, DayH);
    lv_obj_align(DayBg, Calendar, LV_ALIGN_IN_TOP_MID, 0, BgPadTop + BgPadBottom + HeaderHeight);
    lv_obj_set_style_local_bg_color(DayBg, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY);
    lv_obj_set_style_local_bg_opa(DayBg, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_50);

    lv_obj_t *ContHeader = lv_cont_create(Calendar, NULL);
    lv_obj_set_style_local_bg_opa(ContHeader, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_COVER);
    lv_obj_set_style_local_bg_color(ContHeader, LV_CONT_PART_MAIN, LV_STATE_DEFAULT,
                                    lv_obj_get_style_bg_color(Calendar, LV_CALENDAR_PART_HEADER));
    lv_obj_set_style_local_pad_left(ContHeader, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, BgPadLeft);
    lv_obj_set_style_local_pad_right(ContHeader, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, BgPadRight);
    lv_obj_set_size(ContHeader, FP_HOR_RES - BgPadLeft - BgPadRight, HeaderHeight + BgPadTop);
    lv_obj_align(ContHeader, DayBg, LV_ALIGN_OUT_TOP_MID, 0, 0);

    lv_obj_t *LabelL = lv_label_create(ContHeader, NULL);
    lv_obj_set_style_local_text_color(LabelL, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT,
                                      lv_obj_get_style_text_color(Calendar, LV_CALENDAR_PART_HEADER));
    lv_obj_set_style_local_text_font(LabelL, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, HeaderFont);
    INT8 Text[20];
    if (UI_LANG_CH == lv_lang_act())
    {
        snprintf(Text, 20, "%d.%d",
                 CalDesc->Calendar.ShowedDate.year,
                 CalDesc->Calendar.ShowedDate.month);
    }
    else
    {
        INT8 *EnMonth[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
        snprintf(Text, 20, "%s %d",
                 EnMonth[CalDesc->Calendar.ShowedDate.month - 1],
                 CalDesc->Calendar.ShowedDate.year);
    }
    lv_label_set_text(LabelL, Text);
    lv_obj_align(LabelL, ContHeader, LV_ALIGN_IN_LEFT_MID, 0, 0);

    lv_obj_t *LabelR = lv_label_create(ContHeader, LabelL);
    if (CalDesc->Calendar.ShowedDateInfoCb)
    {
        CalDesc->Calendar.ShowedDateInfoCb(&(CalDesc->Calendar.ShowedDate), Text);
        lv_label_set_text(LabelR, Text);
    }
    else
    {
        lv_label_set_text(LabelR, "");
    }
    lv_obj_align(LabelR, ContHeader, LV_ALIGN_IN_RIGHT_MID, 0, 0);

    /* lv_calendar_set_highlighted_dates(Calendar, CalDesc->Calendar.HighlihtedDays, */
    /*     CalDesc->Calendar.HighlitedDaysCnt); */
    lv_calendar_set_today_date(Calendar, &(CalDesc->Calendar.Today));
    lv_calendar_ext_t * Ext = lv_obj_get_ext_attr(Calendar);
    Hal_Mem_Copy(&Ext->pressed_date, &(CalDesc->Calendar.ShowedDate), sizeof(lv_calendar_date_t));
    lv_calendar_set_showed_date(Calendar,&(CalDesc->Calendar.ShowedDate));
    if (UI_LANG_CH == lv_lang_act())
    {
        lv_calendar_set_day_names(Calendar,CaleDays);
    }

    CalDesc->Calendar.Calendar = Calendar;
    UI_Normal_Group_Create(Calendar, NULL,NULL);
    UI_Normal_ButtonBar_Create(&(CalDesc->ButtonBar), Win);
    UI_Normal_KeyFunc_Set(CalDesc->KeyFunc);
    FocusedObj_Signal_Func.GroupType = UI_GROUP_TYPE_CALENDAR;
} /* UI_Calendar_Create */


/**
 * Creat Desktop
 * param (in) DesktopDesc: UI_Desktop_Desc_t*
 * return  VOID
 */
VOID UI_Desktop_Create(VOID *DesktopDesc)
{
    if (DesktopDesc == NULL)
    {
        return;
    }

    UI_Desktop_Desc_t *DeskDesc = (UI_Desktop_Desc_t *)DesktopDesc;

    lv_obj_t          *Win = UI_Normal_FullScreen_Win_Create();

    lv_obj_t          *Wallpaper_Img = lv_img_create(Win, NULL);
    lv_img_set_auto_size(Wallpaper_Img, FALSE);
    lv_obj_set_size(Wallpaper_Img, FP_HOR_RES, FP_VER_RES);
    lv_obj_align(Wallpaper_Img, Win, LV_ALIGN_CENTER, 0, 0);

    lv_img_set_src(Wallpaper_Img, DeskDesc->Wall_Paper_Img);
    DeskDesc->Img = Wallpaper_Img;

    UI_ObjAlign_Info_t AlignInfo;
    memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t));
    AlignInfo.Align               = LV_ALIGN_IN_TOP_MID;
    AlignInfo.y                   = FP_TITLE_BAR_H + 5;
    AlignInfo.x                   = 0;
    DeskDesc->Oper_Label[0].Label = UI_Normal_Label_Create(Wallpaper_Img,
                                                           &(DeskDesc->Oper_Label[0]),
                                                           FP_HOR_RES, FP_VER_RES / 10, &AlignInfo);

    AlignInfo.Align               = LV_ALIGN_OUT_BOTTOM_MID;
    AlignInfo.RefObj              = lv_obj_get_parent(DeskDesc->Oper_Label[0].Label);
    AlignInfo.x                   = 0;
    AlignInfo.y                   = 0;
    DeskDesc->Oper_Label[1].Label = UI_Normal_Label_Create(Wallpaper_Img,
                                                           &(DeskDesc->Oper_Label[1]),
                                                           FP_HOR_RES,FP_VER_RES / 10, &AlignInfo);

    AlignInfo.RefObj             = lv_obj_get_parent(DeskDesc->Oper_Label[1].Label);
    DeskDesc->ContLabel[0].Label = UI_Normal_Label_Create(Wallpaper_Img, &(DeskDesc->ContLabel[0]),
        FP_HOR_RES, FP_VER_RES / 4, &AlignInfo);
    lv_obj_add_style(DeskDesc->ContLabel[0].Label, LV_LABEL_PART_MAIN, &label_sec);
    lv_obj_set_style_local_text_font(DeskDesc->ContLabel[0].Label, LV_LABEL_PART_MAIN,
                                     LV_STATE_DEFAULT, DeskDesc->ContLabel[0].TxtFont);

    AlignInfo.RefObj             = DeskDesc->ContLabel[0].Label;
    DeskDesc->ContLabel[1].Label = UI_Normal_Label_Create(Wallpaper_Img, &(DeskDesc->ContLabel[1]),
        FP_HOR_RES, FP_VER_RES / 6, &AlignInfo);

    AlignInfo.RefObj             = DeskDesc->ContLabel[1].Label;
    DeskDesc->ContLabel[2].Label = UI_Normal_Label_Create(Wallpaper_Img, &(DeskDesc->ContLabel[2]),
        FP_HOR_RES, FP_VER_RES / 6, &AlignInfo);

    UI_Normal_ButtonBar_Create(&(DeskDesc->ButtonBar), Win);
    UI_Normal_KeyFunc_Set(DeskDesc->KeyFunc);
    UI_Normal_Group_Create(Win, NULL, NULL);
} /* UI_Desktop_Create */


/**
 * Creat Status_Bar
 * param (in) StaBarDesc: UI_Status_Bar_Desc_t*
 * return  VOID
 */
VOID UI_Status_Bar_Create(UI_Status_Bar_Desc_t *StaBarDesc)
{
    if (StaBarDesc == NULL)
    {
        return;
    }

    lv_obj_t *Cont = lv_cont_create(FP_PARENT, NULL);
    lv_obj_set_size(Cont, FP_HOR_RES, FP_STATUS_BAR_H);
    lv_obj_set_pos(Cont, 0, 0);

    lv_coord_t PadInner = 3;
    lv_coord_t PadHor = LV_DPI / 8;

    lv_img_header_t ImgHeader;
    lv_img_decoder_get_info(SYMBOL_SIGNAL_5, &ImgHeader);
    lv_obj_t *ImgSim1 = lv_img_create(Cont, NULL);
    lv_obj_set_size(ImgSim1, ImgHeader.w, ImgHeader.h);
    lv_obj_align(ImgSim1, Cont, LV_ALIGN_IN_LEFT_MID, PadHor, 0);
    lv_obj_t *ImgSim2 = lv_img_create(Cont, NULL);
    lv_obj_set_size(ImgSim2, ImgHeader.w, ImgHeader.h);
    lv_obj_align(ImgSim2, ImgSim1, LV_ALIGN_OUT_RIGHT_MID, PadInner, 0);

    lv_obj_t * BatLabel = lv_label_create(Cont, NULL);
    lv_label_set_text(BatLabel, StaBarDesc->BatteryLabel.SymbolId);
    lv_obj_align(BatLabel, Cont, LV_ALIGN_IN_RIGHT_MID, -PadHor, 0);

    lv_coord_t StaContW = lv_obj_get_width_fit(Cont) - lv_obj_get_width(BatLabel)
        - ImgHeader.w * 2 - PadInner * 2 - PadHor * 2;
    lv_obj_t *StaCont = lv_cont_create(Cont, NULL);
    lv_obj_set_size(StaCont, StaContW, FP_STATUS_BAR_H);
    lv_obj_add_style(StaCont, LV_CONT_PART_MAIN, &lv_style_transp_tight);
    lv_cont_set_layout(StaCont, LV_LAYOUT_OFF);
    lv_obj_align(StaCont, BatLabel, LV_ALIGN_OUT_LEFT_MID, -PadInner, 0);

    StaBarDesc->SimImg[0].Img        = ImgSim1;
    StaBarDesc->SimImg[1].Img        = ImgSim2;
    StaBarDesc->StatusCont.Container = StaCont;
    StaBarDesc->BatteryLabel.Label   = BatLabel;
}


/**
 * Creat FullScreen_Key_Guard
 * param (in) FullScrnKeyGuardDesc: UI_FullScreen_Key_Guard_Desc_t*
 * return  VOID
 */
VOID UI_FullScreen_Key_Guard_Create(VOID *FullScrnKeyGuardDesc)
{
    if (FullScrnKeyGuardDesc == NULL)
    {
        return;
    }

    UI_FullScreen_Key_Guard_Desc_t *FullKeyGuardDesc =
        (UI_FullScreen_Key_Guard_Desc_t *)FullScrnKeyGuardDesc;

    lv_obj_t *Win = UI_Normal_FullScreen_Win_Create();

    lv_obj_t *Cont = lv_cont_create(Win, NULL);
    lv_obj_set_size(Cont, FP_HOR_RES, FP_VER_RES);

    UI_ObjAlign_Info_t AlignInfo;
    memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t));
    AlignInfo.Align                   = LV_ALIGN_IN_TOP_LEFT;
    AlignInfo.y                       = FP_VER_RES / 4;
    FullKeyGuardDesc->TimeLabel.Label = UI_Normal_Label_Create(Cont, &(FullKeyGuardDesc->TimeLabel),
        FP_HOR_RES, FP_VER_RES / 8,
        &AlignInfo);
    lv_obj_add_style(FullKeyGuardDesc->TimeLabel.Label, LV_LABEL_PART_MAIN, &label_sec);
    lv_obj_set_style_local_text_font(FullKeyGuardDesc->TimeLabel.Label, LV_LABEL_PART_MAIN,
                                     LV_STATE_DEFAULT, FullKeyGuardDesc->TimeLabel.TxtFont);

    AlignInfo.Align                   = LV_ALIGN_OUT_BOTTOM_MID;
    AlignInfo.RefObj                  = FullKeyGuardDesc->TimeLabel.Label;
    AlignInfo.y                       = 10;
    FullKeyGuardDesc->DateLabel.Label = UI_Normal_Label_Create(Cont, &(FullKeyGuardDesc->DateLabel),
        FP_HOR_RES, FP_VER_RES / 10,
        &AlignInfo);

    lv_obj_t *ContSymbol = lv_cont_create(Cont, NULL);
    lv_cont_set_fit(ContSymbol, TRUE);

    FullKeyGuardDesc->SymbolImg[0].Img = lv_img_create(ContSymbol, NULL);
    lv_img_set_src(FullKeyGuardDesc->SymbolImg[0].Img, "");
    FullKeyGuardDesc->SymbolImg[1].Img = lv_img_create(ContSymbol, NULL);
    lv_img_set_src(FullKeyGuardDesc->SymbolImg[1].Img, "");
    lv_obj_align(FullKeyGuardDesc->SymbolImg[1].Img, FullKeyGuardDesc->SymbolImg[0].Img,
                 LV_ALIGN_OUT_RIGHT_MID, 2, 0);
    lv_obj_align(ContSymbol, FullKeyGuardDesc->DateLabel.Label, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);

    UI_Normal_KeyFunc_Set(FullKeyGuardDesc->KeyFunc);
    UI_Normal_Group_Create(Cont, NULL, NULL);
}


/**
 * Create Missed call or sms prompting UI
 * param (in) DesktopPromptDesc: UI_Desktop_Prompt_Desc_t*
 * return  VOID
 */
VOID UI_Desktop_Prompt_Create(VOID *DesktopPromptDesc)
{
    if (DesktopPromptDesc == NULL)
    {
        return;
    }
    UI_Desktop_Prompt_Desc_t *DesktopPrompt = (UI_Desktop_Prompt_Desc_t *)DesktopPromptDesc;
    lv_obj_t                 *Win           = UI_Normal_Win_Create(FALSE,NULL);
    lv_win_set_scrollbar_mode(Win, LV_SCROLLBAR_MODE_HIDE);

    UI_ObjAlign_Info_t AlignInfo;
    memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t));
    AlignInfo.Align                    = LV_ALIGN_IN_TOP_MID;
    AlignInfo.y                        = 5;
    AlignInfo.x                        = 0;
    DesktopPrompt->Oper_Label[0].Label = UI_Normal_Label_Create(Win,
                                                                &(DesktopPrompt->Oper_Label[0]),
                                                                FP_HOR_RES, FP_VER_RES / 10,
                                                                &AlignInfo);

    AlignInfo.Align                    = LV_ALIGN_OUT_BOTTOM_MID;
    AlignInfo.RefObj                   = lv_obj_get_parent(DesktopPrompt->Oper_Label[0].Label);
    AlignInfo.x                        = 0;
    AlignInfo.y                        = 0;
    DesktopPrompt->Oper_Label[1].Label = UI_Normal_Label_Create(Win,
                                                                &(DesktopPrompt->Oper_Label[1]),
                                                                FP_HOR_RES, FP_VER_RES / 10,
                                                                &AlignInfo);

    AlignInfo.Align                = LV_ALIGN_OUT_BOTTOM_LEFT;
    AlignInfo.RefObj               = lv_obj_get_parent(DesktopPrompt->Oper_Label[1].Label);
    AlignInfo.y                    = 5;
    DesktopPrompt->ContLabel.Label = UI_Normal_Label_Create(Win, &(DesktopPrompt->ContLabel),
                                                            FP_HOR_RES, FP_VER_RES / 8, &AlignInfo);

    UI_Normal_ButtonBar_Create(&(DesktopPrompt->ButtonBar), Win);
    UI_Normal_KeyFunc_Set(DesktopPrompt->KeyFunc);
    UI_Normal_Group_Create(Win, NULL, NULL);
}


/**
 * Create DialPad UI
 * param (in) DialPadDesc: UI_DialPad_Desc_t*
 * return  VOID
 */
VOID UI_DialPad_Create(VOID *DialPadDesc)
{
    if (DialPadDesc == NULL)
    {
        return;
    }

    UI_DialPad_Desc_t *DialPad = (UI_DialPad_Desc_t *)DialPadDesc;

    lv_obj_t          *Win = UI_Normal_Win_Create(FALSE,NULL);
    lv_win_set_scrollbar_mode(Win, LV_SCROLLBAR_MODE_HIDE);

    UI_ObjAlign_Info_t AlignInfo;
    memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t));

    AlignInfo.Align              = LV_ALIGN_IN_TOP_MID;
    AlignInfo.y                  = 5;
    AlignInfo.x                  = 0;
    DialPad->Oper_Label[0].Label = UI_Normal_Label_Create(Win, &(DialPad->Oper_Label[0]),
                                                          FP_HOR_RES, FP_VER_RES / 10, &AlignInfo);

    AlignInfo.Align              = LV_ALIGN_OUT_BOTTOM_MID;
    AlignInfo.RefObj             = lv_obj_get_parent(DialPad->Oper_Label[0].Label);
    AlignInfo.y                  = 0;
    AlignInfo.x                  = 0;
    DialPad->Oper_Label[1].Label = UI_Normal_Label_Create(Win, &(DialPad->Oper_Label[1]),
                                                          FP_HOR_RES, FP_VER_RES / 10, &AlignInfo);

    UINT16   TaHeight = FP_NOTITLE_CONT_BAR_H * 3 / 4;
    lv_obj_t *Ta      = lv_textarea_create(Win, NULL);
    lv_obj_set_size(Ta, FP_HOR_RES, TaHeight);
    lv_obj_align(Ta, lv_obj_get_parent(DialPad->Oper_Label[1].Label), LV_ALIGN_OUT_BOTTOM_MID, 0, 5);
    lv_textarea_set_cursor_hidden(Ta, DialPad->PadTa.TaCursorHide);
    lv_obj_set_style_local_bg_color(Ta, LV_TEXTAREA_PART_BG, LV_STATE_DEFAULT,
                                    LV_COLOR_MAKE(0x60,0xC0,0xFF));
    lv_obj_set_style_local_text_color(Ta, LV_TEXTAREA_PART_BG, LV_STATE_DEFAULT,
                                      LV_COLOR_WHITE);
    lv_obj_set_style_local_text_font(Ta, LV_TEXTAREA_PART_BG, LV_STATE_DEFAULT,
                                     LV_FONT_PTR_DRIODSANSFALLBACKFULL_LARGE);
    lv_obj_set_style_local_border_color(Ta, LV_TEXTAREA_PART_CURSOR, LV_STATE_DEFAULT,
                                        LV_COLOR_WHITE);
    lv_obj_set_style_local_border_width(Ta, LV_TEXTAREA_PART_CURSOR, LV_STATE_DEFAULT, 2);
    if (DialPad->PadTa.TaTxt != NULL)
    {
        lv_textarea_set_text(Ta,  (const INT8 *)DialPad->PadTa.TaTxt);
    }
    DialPad->PadTa.TextArea = Ta;

    UI_Normal_KeyFunc_Set(DialPad->KeyFunc);
    UI_Normal_Group_Create(Ta, NULL, NULL);
    UI_Normal_ButtonBar_Create(&(DialPad->ButtonBar), Win);
} /* UI_DialPad_Create */


/**
 * Create camera
 * param (in) CameraDesc: UI_Camera_Desc_t*
 * return  VOID
 */
VOID UI_Camera_Create(VOID *CameraDesc)
{
    if (CameraDesc == NULL)
    {
        return;
    }
    UI_Camera_Desc_t *Desc = (UI_Camera_Desc_t *)CameraDesc;

    lv_obj_t *Win = UI_Normal_Win_Create(FALSE, NULL);
    lv_obj_set_height(Win, FP_VER_RES);
    lv_obj_set_y(Win, 0);

    Desc->Img = lv_img_create(Win, NULL);

    if (Desc->Btn.Valid)
    {
        Desc->Btn.Button = lv_btn_create(Win, NULL);
        lv_obj_set_style_local_pad_left(Desc->Btn.Button, LV_BTN_PART_MAIN,
                                        LV_STATE_DEFAULT, 3);
        lv_obj_set_style_local_pad_right(Desc->Btn.Button, LV_BTN_PART_MAIN,
                                         LV_STATE_DEFAULT, 3);
        lv_obj_set_style_local_pad_top(Desc->Btn.Button, LV_BTN_PART_MAIN,
                                         LV_STATE_DEFAULT, 1);
        lv_obj_set_style_local_pad_bottom(Desc->Btn.Button, LV_BTN_PART_MAIN,
                                          LV_STATE_DEFAULT, 1);
        lv_btn_set_fit(Desc->Btn.Button, LV_FIT_TIGHT);
        lv_btn_set_layout(Desc->Btn.Button, LV_LAYOUT_CENTER);

        lv_obj_t *Label = lv_label_create(Desc->Btn.Button, NULL);
        lv_label_set_text_id(Label, Desc->Btn.TxtId);

        lv_obj_align(Desc->Btn.Button, Win, LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0);
        BtnBar_Right = Desc->Btn.Button;
    }

    UI_Normal_Group_Create(Win, NULL, NULL);
    UI_Normal_KeyFunc_Set(Desc->KeyFunc);
}


/*for Interphone demo begin*/
static lv_signal_cb_t Btn_signal_func;


/**
 * Create Label for displaying NetSpeed if switch is on
 * param (in) Btn: lv_obj_t*; ULSpeed:FLOAT; DLSpeed:FLOAT
 * return  lv_obj_t*
 */
lv_obj_t *UI_Create_NetSpeed_Label(lv_obj_t *Btn, FLOAT ULSpeed, FLOAT DLSpeed)
{
    INT8     Str[20];
    lv_obj_t *ItemLabel  = lv_obj_get_child_back(Btn, NULL);
    lv_obj_t *SpeedLabel = lv_label_create(Btn, ItemLabel);
    lv_obj_set_width(SpeedLabel, lv_obj_get_width(Btn) - 2 * lv_obj_get_x(ItemLabel));
    lv_obj_align(SpeedLabel, ItemLabel, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0);

    snprintf(Str, 20, "%s%0.1f%s%s%0.1f%s", LV_SYMBOL_UPLOAD, ULSpeed, "K/s", LV_SYMBOL_DOWNLOAD, DLSpeed,
        "K/s");
    lv_label_set_text(SpeedLabel, Str);
    return(SpeedLabel);
}


/**
 * Create Interphone status bar
 * param (in) StatusBarDesc: UI_Interphone_Status_Bar_Desc_t*
 * return  VOID
 */
VOID UI_Interphone_StatusBar_Create(VOID *StatusBarDesc)
{
    if (StatusBarDesc == NULL)
    {
        return;
    }
    UI_Interphone_Status_Bar_Desc_t *BarDesc = (UI_Interphone_Status_Bar_Desc_t *)StatusBarDesc;

    lv_obj_t                        *Status_Cont = lv_cont_create(FP_PARENT, NULL);
    lv_obj_set_size(Status_Cont, FP_HOR_RES, FP_STATUS_BAR_H);
    lv_obj_set_style_local_pad_inner(Status_Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 0);
    lv_obj_set_pos(Status_Cont, 0, 0);

    UI_ObjAlign_Info_t AlignInfo;
    memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t));
    AlignInfo.RefObj         = Status_Cont;
    AlignInfo.Align          = LV_ALIGN_IN_RIGHT_MID;
    BarDesc->TimeLabel.Label = UI_Normal_Label_Create(Status_Cont, &(BarDesc->TimeLabel), 0, 0,
        &AlignInfo);
    lv_obj_set_style_local_text_letter_space(BarDesc->TimeLabel.Label, LV_LABEL_PART_MAIN,
                                             LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_pad_left(BarDesc->TimeLabel.Label, LV_LABEL_PART_MAIN,
                                    LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_pad_right(BarDesc->TimeLabel.Label, LV_LABEL_PART_MAIN,
                                    LV_STATE_DEFAULT, 1);
    lv_label_set_text(BarDesc->TimeLabel.Label, "00:00");
    lv_obj_align(BarDesc->TimeLabel.Label, Status_Cont, LV_ALIGN_IN_RIGHT_MID, 0, 0);

    AlignInfo.Align             = LV_ALIGN_OUT_LEFT_MID;
    AlignInfo.RefObj            = BarDesc->TimeLabel.Label;
    BarDesc->BatteryLabel.Label = UI_Normal_Label_Create(Status_Cont,&(BarDesc->BatteryLabel), 0, 0,
        &AlignInfo);

    BarDesc->SignalImg.Img = lv_img_create(Status_Cont, NULL);
    lv_img_set_src(BarDesc->SignalImg.Img, BarDesc->SignalImg.ImgSrc);
    lv_obj_align(BarDesc->SignalImg.Img, BarDesc->BatteryLabel.Label, LV_ALIGN_OUT_LEFT_MID, 0, 0);

    if (BarDesc->StanLabel.ImgSrc)
    {
        BarDesc->StanLabel.Img = lv_img_create(Status_Cont, NULL);
        lv_img_set_auto_size(BarDesc->StanLabel.Img, TRUE);
        lv_img_set_src(BarDesc->StanLabel.Img, BarDesc->StanLabel.ImgSrc);
        lv_obj_align(BarDesc->StanLabel.Img,BarDesc->SignalImg.Img, LV_ALIGN_OUT_LEFT_MID, -4, 0);
    }
    else
    {
        AlignInfo.RefObj         = BarDesc->SignalImg.Img;
        BarDesc->StanLabel.Label = UI_Normal_Label_Create(Status_Cont, &(BarDesc->StanLabel), 0, 0,
                                                          &AlignInfo);
        lv_obj_set_style_local_text_color(BarDesc->StanLabel.Label, LV_LABEL_PART_MAIN,
                                          LV_STATE_DEFAULT, LV_COLOR_MAKE(0x60,0xC0,0xFF));
        lv_obj_set_style_local_text_letter_space(BarDesc->StanLabel.Label, LV_LABEL_PART_MAIN,
                                                 LV_STATE_DEFAULT, 0);
        lv_obj_set_style_local_pad_left(BarDesc->StanLabel.Label, LV_LABEL_PART_MAIN,
                                        LV_STATE_DEFAULT, 0);
        lv_label_set_text(BarDesc->StanLabel.Label, "");
        lv_obj_align(BarDesc->StanLabel.Label,BarDesc->SignalImg.Img, LV_ALIGN_OUT_LEFT_MID, 0, 0);
    }

    if (BarDesc->StanLabel.ImgSrc)
    {
        AlignInfo.RefObj = BarDesc->StanLabel.Img;
    }
    else
    {
        AlignInfo.RefObj = BarDesc->StanLabel.Label;
    }
    BarDesc->VolumeLabel.Label = UI_Normal_Label_Create(Status_Cont, &(BarDesc->VolumeLabel), 0, 0,
        &AlignInfo);
    lv_obj_set_style_local_pad_right(BarDesc->VolumeLabel.Label, LV_LABEL_PART_MAIN,
                                     LV_STATE_DEFAULT, 0);

    AlignInfo.Align                 = LV_ALIGN_IN_LEFT_MID;
    AlignInfo.RefObj                = Status_Cont;
    BarDesc->OnlineStateLabel.Label =
        UI_Normal_Label_Create(Status_Cont, &(BarDesc->OnlineStateLabel), 0, 0, &AlignInfo);
} /* UI_Interphone_StatusBar_Create */


/**
 * Create Interphone login UI
 * param (in) LoginDesc: UI_Login_Desc_t*
 * return  VOID
 */
VOID UI_Login_Create(VOID *LoginDesc)
{
    if (LoginDesc == NULL)
    {
        return;
    }
    UI_Login_Desc_t   *Login = (UI_Login_Desc_t *)LoginDesc;

    lv_obj_t          *Win = UI_Normal_Win_Create(FALSE,NULL);
    lv_obj_set_style_local_bg_color(Win, LV_WIN_PART_BG, LV_STATE_DEFAULT, LV_COLOR_WHITE);
    lv_obj_set_style_local_bg_opa(Win, LV_WIN_PART_BG, LV_STATE_DEFAULT, LV_OPA_COVER);
    lv_obj_set_height(Win, FP_VER_RES - FP_STATUS_BAR_H);
    lv_obj_set_y(Win, FP_STATUS_BAR_H);

    lv_obj_t *Cont1 = lv_cont_create(Win, NULL);
    lv_cont_set_layout(Cont1, LV_LAYOUT_OFF);
    lv_obj_set_size(Cont1, FP_HOR_RES, lv_obj_get_height(Win) / 4);
    lv_obj_set_pos(Cont1, 0, 0);
    lv_obj_set_style_local_bg_color(Cont1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE);
    lv_obj_set_style_local_bg_opa(Cont1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_COVER);
    lv_obj_set_style_local_shadow_width(Cont1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 1);
    lv_obj_set_style_local_shadow_color(Cont1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY);
    lv_obj_set_style_local_shadow_ofs_y(Cont1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 1);

    lv_obj_t *Cont2 = lv_cont_create(Win, Cont1);
    lv_obj_set_y(Cont2, lv_obj_get_height(Win) / 4);
    lv_obj_t *Cont3 = lv_cont_create(Win, Cont1);
    lv_obj_set_y(Cont3, lv_obj_get_height(Win) / 2);

    UI_ObjAlign_Info_t AlignInfo;
    memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t));

    AlignInfo.Align       = LV_ALIGN_IN_TOP_LEFT;
    AlignInfo.y           = 0;
    AlignInfo.x           = 0;
    Login->Label[0].Label = UI_Normal_Label_Create(Cont1, &(Login->Label[0]), 0,0, &AlignInfo);

    AlignInfo.Align       = LV_ALIGN_OUT_RIGHT_MID;
    AlignInfo.RefObj      = Login->Label[0].Label;
    AlignInfo.x           = -5;
    Login->Label[1].Label = UI_Normal_Label_Create(Cont1,&(Login->Label[1]),0,0, &AlignInfo);

    AlignInfo.Align       = LV_ALIGN_OUT_BOTTOM_MID;
    AlignInfo.RefObj      = Login->Label[0].Label;
    AlignInfo.x           = 1;
    AlignInfo.y           = 0;
    Login->Label[2].Label = UI_Normal_Label_Create(Cont2,&(Login->Label[2]),0,0, &AlignInfo);

    AlignInfo.Align       = LV_ALIGN_OUT_RIGHT_MID;
    AlignInfo.RefObj      = Login->Label[2].Label;
    AlignInfo.x           = -5;
    AlignInfo.y           = 0;
    Login->Label[3].Label = UI_Normal_Label_Create(Cont2,&(Login->Label[3]),0,0, &AlignInfo);

    AlignInfo.Align       = LV_ALIGN_OUT_BOTTOM_MID;
    AlignInfo.RefObj      = Login->Label[2].Label;
    AlignInfo.x           = 0;
    AlignInfo.y           = 0;
    Login->Label[4].Label = UI_Normal_Label_Create(Cont3,&(Login->Label[4]),0,0, &AlignInfo);

    AlignInfo.Align       = LV_ALIGN_OUT_RIGHT_MID;
    AlignInfo.RefObj      = Login->Label[4].Label;
    AlignInfo.x           = -5;
    AlignInfo.y           = -2;
    Login->Label[5].Label = UI_Normal_Label_Create(Cont3,&(Login->Label[5]),0,0, &AlignInfo);

    for (UINT8 i = 0;i < 6;i++)
    {
        lv_obj_add_style(Login->Label[i].Label, LV_LABEL_PART_MAIN, &label_sec);
        lv_obj_set_style_local_text_color(Login->Label[i].Label, LV_LABEL_PART_MAIN,
                                          LV_STATE_DEFAULT, LV_COLOR_BLACK);
        lv_obj_set_style_local_text_letter_space(Login->Label[i].Label, LV_LABEL_PART_MAIN,
                                                 LV_STATE_DEFAULT, 0);
    }

    lv_obj_t *Btn1 = lv_btn_create(Cont1, NULL);
    lv_obj_set_size(Btn1, FP_HOR_RES / 8, FP_HOR_RES / 8);
    lv_coord_t Offset = FP_HOR_RES - 5 - lv_obj_get_x(Login->Label[1].Label) -
        lv_obj_get_width(Login->Label[1].Label) - FP_HOR_RES / 8;
    lv_obj_align(Btn1, Login->Label[1].Label, LV_ALIGN_OUT_RIGHT_MID, Offset, 1);
    lv_obj_t          *label1 = lv_label_create(Btn1, NULL);
    lv_label_set_text(label1, Login->OperatorOpt.SymbolId1);
    lv_obj_add_style(label1, LV_LABEL_PART_MAIN, &label_sec);
    lv_obj_set_style_local_text_color(label1, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY);
    lv_obj_set_style_local_bg_color(Btn1, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE);
    lv_obj_set_style_local_border_opa(Btn1, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_0);
    lv_obj_set_style_local_border_opa(Btn1, LV_BTN_PART_MAIN, LV_STATE_FOCUSED, LV_OPA_COVER);
    lv_obj_set_style_local_border_color(Btn1, LV_BTN_PART_MAIN, LV_STATE_FOCUSED,
                                        LV_COLOR_MAKE(0xFF, 0xD8, 0x00));
    lv_obj_set_style_local_border_width(Btn1, LV_BTN_PART_MAIN, LV_STATE_FOCUSED, 2);

    lv_obj_t          *Btn2 = lv_btn_create(Win, NULL);
    lv_obj_t *label2 = lv_label_create(Btn2, NULL);
    lv_label_set_text_id(label2, Login->LoginBtn.TxtId);
    lv_obj_align(label2, NULL, LV_ALIGN_CENTER, 0, 0);
    lv_obj_set_style_local_bg_color(Btn2, LV_BTN_PART_MAIN, LV_STATE_DEFAULT,
                                    LV_COLOR_MAKE(0x60,0xC0,0xFF));
    lv_obj_set_style_local_radius(Btn2, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 3);
    lv_obj_set_style_local_border_opa(Btn2, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_0);
    lv_obj_set_style_local_text_color(Btn2, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE);
    lv_obj_set_style_local_border_opa(Btn2, LV_BTN_PART_MAIN, LV_STATE_FOCUSED, LV_OPA_COVER);
    lv_obj_set_style_local_border_color(Btn2, LV_BTN_PART_MAIN, LV_STATE_FOCUSED,
                                        LV_COLOR_MAKE(0xFF, 0xD8, 0x00));
    lv_obj_set_style_local_border_width(Btn2, LV_BTN_PART_MAIN, LV_STATE_FOCUSED, 2);
    lv_obj_set_size(Btn2, FP_HOR_RES - 10, FP_VER_RES / 6);
    lv_obj_align(Btn2, Cont3, LV_ALIGN_OUT_BOTTOM_MID, 0, 5);

    Login->OperatorOpt.Button = Btn1;
    Login->LoginBtn.Button    = Btn2;

    UI_Normal_KeyFunc_Set(Login->KeyFunc);
    UI_Normal_Group_Create(Btn1, Btn2, NULL);
} /* UI_Login_Create */


/**
 * Get switch container from button
 * param (in) Btn:lv_obj_t*;
 * return  lv_obj_t*
 */
lv_obj_t *UI_Setting_Get_Sw_Cont(lv_obj_t *Btn)
{
    lv_obj_t *Child = lv_obj_get_child(Btn, NULL);
    while (Child)
    {
        if (UI_BASE_OBJ_SW == UI_Get_User_Num(Child))
        {
            break;
        }
        Child = lv_obj_get_child(Btn, Child);
    }
    return Child;
}


/**
 * set Interphone setting list selected btn style
 * param (in) List:lv_obj_t*;
 *          Btn:lv_obj_t*
 * return  VOID
 */
VOID UI_Setting_Btn_Selected_Cb(lv_obj_t *List, lv_obj_t *Btn)
{
    lv_obj_t *SelCont = UI_Setting_Get_Sw_Cont(Btn);
    if (SelCont)
    {
        lv_obj_set_style_local_border_opa(SelCont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_COVER);
    }

    lv_obj_t *NextBtn = lv_list_get_next_btn(List, Btn);
    if (NextBtn)
    {
        lv_obj_t *LastCont = UI_Setting_Get_Sw_Cont(NextBtn);
        if (LastCont)
        {
            lv_obj_set_style_local_border_opa(LastCont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT,
                                              LV_OPA_0);
        }
    }

    lv_obj_t *PreBtn = lv_list_get_prev_btn(List, Btn);
    if (PreBtn)
    {
        lv_obj_t *PreCont = UI_Setting_Get_Sw_Cont(PreBtn);
        if (PreCont)
        {
            lv_obj_set_style_local_border_opa(PreCont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_0);
        }
    }

    if(UI_Get_User_Num(Btn) == PHONE_TEXT_ID_AUTO_LOGIN)
    {
        printf("chg focus pos\n");
        lv_page_focus(List, lv_list_get_prev_btn(List, Btn), false);
    }
} /* UI_Setting_Btn_Selected_Cb */


/**
 * Create Interphone Setting UI
 * param (in) LoginDesc: UI_Normal_Container_List_Desc_t*
 * return  VOID
 */
VOID UI_Setting_Create(VOID *SettingDesc)
{
    if (SettingDesc == NULL)
    {
        return;
    }
    UI_Normal_Container_List_Create(SettingDesc);
    UI_Normal_Container_List_Desc_t *SettingList = (UI_Normal_Container_List_Desc_t *)SettingDesc;

    lv_label_set_align(SettingList->TitleBar.Label, LV_LABEL_ALIGN_CENTER);
    lv_obj_add_style(SettingList->TitleBar.Label, LV_LABEL_PART_MAIN, &label_sec);
    lv_obj_set_style_local_text_color(SettingList->TitleBar.Label, LV_LABEL_PART_MAIN,
                                      LV_STATE_DEFAULT, LV_COLOR_WHITE);
    lv_obj_set_style_local_text_letter_space(SettingList->TitleBar.Label, LV_LABEL_PART_MAIN,
                                             LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_bg_opa(SettingList->TitleBar.Label, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT,
                                  LV_OPA_COVER);
    lv_obj_set_style_local_bg_color(SettingList->TitleBar.Label, LV_LABEL_PART_MAIN,
                                    LV_STATE_DEFAULT, LV_COLOR_MAKE(0x60,0xC0,0xFF));
    lv_obj_set_style_local_pad_top(SettingList->TitleBar.Label, LV_LABEL_PART_MAIN,
                                   LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_pad_bottom(SettingList->TitleBar.Label, LV_LABEL_PART_MAIN,
                                      LV_STATE_DEFAULT, 0);

    lv_obj_set_style_local_bg_opa(SettingList->List, LV_LIST_PART_SCROLLABLE, LV_STATE_DEFAULT,
                                  LV_OPA_COVER);
    lv_obj_set_style_local_bg_color(SettingList->List, LV_LIST_PART_SCROLLABLE, LV_STATE_DEFAULT,
                                    LV_COLOR_WHITE);

    lv_coord_t title_bar_h = lv_obj_get_height(SettingList->TitleBar.Label);
    lv_obj_set_size(SettingList->List, FP_HOR_RES,
                    FP_VER_RES - FP_STATUS_BAR_H - title_bar_h);
    lv_obj_align(SettingList->List, lv_obj_get_parent(SettingList->List),
                 LV_ALIGN_IN_BOTTOM_MID, 0, 0);

    for (UINT8 i = 0; i < SettingList->ContList.ListContainerCnt; i++)
    {
        lv_obj_set_style_local_bg_opa(SettingList->ContList.ContainerList[i].Button,
                                      LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_COVER);
        lv_obj_set_style_local_bg_color(SettingList->ContList.ContainerList[i].Button,
                                        LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE);
        lv_obj_set_style_local_pad_top(SettingList->ContList.ContainerList[i].Button,
                                       LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 5);
        lv_obj_set_style_local_pad_bottom(SettingList->ContList.ContainerList[i].Button,
                                          LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 5);
        lv_obj_set_style_local_pad_inner(SettingList->ContList.ContainerList[i].Button,
                                         LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 0);
        lv_obj_set_style_local_text_color(SettingList->ContList.ContainerList[i].Button,
                                          LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
        lv_obj_set_style_local_text_letter_space(SettingList->ContList.ContainerList[i].Button,
                                                 LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 0);
        lv_obj_set_style_local_border_width(SettingList->ContList.ContainerList[i].Button,
                                            LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 2);
        lv_obj_set_style_local_border_color(SettingList->ContList.ContainerList[i].Button,
                                            LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY);
        lv_obj_set_style_local_border_side(SettingList->ContList.ContainerList[i].Button,
                                           LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_BORDER_SIDE_BOTTOM);
        lv_obj_set_style_local_outline_opa(SettingList->ContList.ContainerList[i].Button,
                                           LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_0);
        lv_obj_set_style_local_bg_color(SettingList->ContList.ContainerList[i].Button,
                                        LV_BTN_PART_MAIN, LV_STATE_FOCUSED, LV_COLOR_WHITE);

        if ((i != 0) && (SettingList->ContList.ContainerList[i].Choise != UI_BASE_OBJ_SW))
        {
            lv_obj_set_style_local_outline_color(SettingList->ContList.ContainerList[i].Button,
                                                 LV_BTN_PART_MAIN, LV_STATE_DEFAULT,
                                                 LV_COLOR_MAKE(0xFF, 0xCD, 0x77));
            lv_obj_set_style_local_outline_pad(SettingList->ContList.ContainerList[i].Button,
                                               LV_BTN_PART_MAIN, LV_STATE_DEFAULT, -4);
            lv_obj_set_style_local_outline_width(SettingList->ContList.ContainerList[i].Button,
                                                 LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 2);
            lv_obj_set_style_local_outline_opa(SettingList->ContList.ContainerList[i].Button,
                                               LV_BTN_PART_MAIN, LV_STATE_FOCUSED, LV_OPA_COVER);
        }
    }

    lv_obj_set_height(SettingList->ContList.ContainerList[0].Label.Label,
        lv_obj_get_height(SettingList->List) / 4);
    lv_obj_set_height(SettingList->ContList.ContainerList[0].u.Label2.Label,
        lv_obj_get_height(SettingList->List) / 4);
    lv_obj_set_style_local_text_color(SettingList->ContList.ContainerList[0].Label.Label,
                                      LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
    lv_obj_set_style_local_text_color(SettingList->ContList.ContainerList[0].u.Label2.Label,
                                      LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);

    lv_obj_set_height(SettingList->ContList.ContainerList[10].Label.Label,
        lv_obj_get_height(SettingList->List) / 4);
    lv_obj_set_height(SettingList->ContList.ContainerList[10].u.Bar.Bar,
        lv_obj_get_height(SettingList->List) / 8);
    lv_obj_set_style_local_bg_color(SettingList->ContList.ContainerList[10].u.Bar.Bar,
                                    LV_BAR_PART_INDIC, LV_STATE_DEFAULT, LV_COLOR_MAKE(0xAF,0xD3,0xD8));
    lv_obj_set_style_local_bg_color(SettingList->ContList.ContainerList[10].u.Bar.Bar,
                                    LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, LV_COLOR_MAKE(0xAF,0xD3,0xD8));
    lv_obj_set_style_local_radius(SettingList->ContList.ContainerList[10].u.Bar.Bar,
                                  LV_BAR_PART_BG, LV_STATE_DEFAULT,LV_RADIUS_CIRCLE);
    lv_obj_set_style_local_radius(SettingList->ContList.ContainerList[10].u.Bar.Bar,
                                  LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);

    lv_obj_set_height(SettingList->ContList.ContainerList[11].Label.Label,
        lv_obj_get_height(SettingList->List) / 4);
    lv_obj_set_height(SettingList->ContList.ContainerList[11].u.Label2.Label,
        lv_obj_get_height(SettingList->List) / 4);

    if (SettingList->ContList.ContainerList[7].u.Sw.State == TRUE)
    {
        UI_Create_NetSpeed_Label(SettingList->ContList.ContainerList[7].Button, 0.2, 1.5);
    }
    Btn_Sel_Func = UI_Setting_Btn_Selected_Cb;
    Btn_Sel_Func(SettingList->List,
                 SettingList->ContList.ContainerList[SettingList->ContList.Index].Button);
} /* UI_Setting_Create */


/**
 * Create Interphone grouplist UI
 * param (in) GpoupListDesc: UI_GroupList_Desc_t*
 * return  VOID
 */
VOID UI_GroupList_Create(VOID *GroupListDesc)
{
    if (GroupListDesc == NULL)
    {
        return;
    }
    UI_Normal_List_Only_Create(GroupListDesc);
    UI_Normal_List_Only_Desc_t *List = (UI_Normal_List_Only_Desc_t *)GroupListDesc;

    lv_obj_set_size(List->List.List, FP_HOR_RES, FP_VER_RES - FP_STATUS_BAR_H - FP_TITLE_BAR_H);

    lv_label_set_align(List->TitleBar.Label, LV_LABEL_ALIGN_CENTER);
    lv_obj_add_style(List->TitleBar.Label, LV_LABEL_PART_MAIN, &label_sec);
    lv_obj_set_style_local_text_color(List->TitleBar.Label, LV_LABEL_PART_MAIN,
                                      LV_STATE_DEFAULT, LV_COLOR_WHITE);
    lv_obj_set_style_local_text_letter_space(List->TitleBar.Label, LV_LABEL_PART_MAIN,
                                             LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_bg_opa(List->TitleBar.Label, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT,
                                  LV_OPA_COVER);
    lv_obj_set_style_local_bg_color(List->TitleBar.Label, LV_LABEL_PART_MAIN,
                                    LV_STATE_DEFAULT, LV_COLOR_MAKE(0x60,0xC0,0xFF));
    lv_obj_set_style_local_pad_top(List->TitleBar.Label, LV_LABEL_PART_MAIN,
                                   LV_STATE_DEFAULT, 0);

    lv_obj_set_style_local_bg_color(List->List.List, LV_LIST_PART_SCROLLABLE, LV_STATE_DEFAULT,
                                    LV_COLOR_WHITE);
    lv_obj_set_style_local_bg_opa(List->List.List, LV_LIST_PART_SCROLLABLE, LV_STATE_DEFAULT,
                                  LV_OPA_COVER);

    for (UINT8 i = 0; i < List->List.ListButtonCnt; i++)
    {
        lv_obj_set_style_local_bg_opa(List->List.ButtonList[i].Button, LV_BTN_PART_MAIN,
                                      LV_STATE_DEFAULT, LV_OPA_COVER);
        lv_obj_set_style_local_bg_color(List->List.ButtonList[i].Button, LV_BTN_PART_MAIN,
                                        LV_STATE_DEFAULT, LV_COLOR_WHITE);
        lv_obj_set_style_local_pad_top(List->List.ButtonList[i].Button,
                                       LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 0);
        lv_obj_set_style_local_pad_bottom(List->List.ButtonList[i].Button,
                                          LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 0);
        lv_obj_set_style_local_pad_inner(List->List.ButtonList[i].Button,
                                         LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 2);
        lv_obj_set_style_local_text_color(List->List.ButtonList[i].Button,
                                          LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
        lv_obj_set_style_local_text_letter_space(List->List.ButtonList[i].Button,
                                                 LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 0);
        lv_obj_set_style_local_bg_color(List->List.ButtonList[i].Button, LV_BTN_PART_MAIN,
                                        LV_STATE_FOCUSED, LV_COLOR_MAKE(0xFF, 0xCD, 0x77));
    }

    lv_obj_t          *ListBtn;
    lv_obj_t          *BtnLabel;
    lv_obj_t          *BtnImg1;
    lv_obj_t          *BtnImg2;
    ListBtn = lv_obj_get_child_back(lv_obj_get_child(List->List.List, NULL), NULL);
    while (ListBtn)
    {
        BtnImg1 = lv_obj_get_child_back(ListBtn, NULL);
        if (BtnImg1)
        {
            lv_obj_add_style(BtnImg1, LV_IMG_PART_MAIN, &img_light);
            lv_obj_set_style_local_image_recolor(BtnImg1, LV_IMG_PART_MAIN, LV_STATE_DEFAULT,
                                                 LV_COLOR_MAKE(0x60,0xC0,0xFF));
            lv_obj_set_style_local_image_recolor_opa(BtnImg1, LV_IMG_PART_MAIN, LV_STATE_DEFAULT,
                                                     LV_OPA_COVER);
        }
        BtnLabel = lv_obj_get_child_back(ListBtn, BtnImg1);
        lv_obj_set_width(BtnLabel, lv_obj_get_width(BtnLabel) + 10);
        lv_obj_set_style_local_border_opa(BtnLabel, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_0);
        BtnImg2 = lv_obj_get_child(ListBtn, NULL);
        lv_obj_add_style(BtnImg2, LV_IMG_PART_MAIN, &img_dark);
        lv_obj_set_style_local_border_opa(BtnImg2, LV_IMG_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_0);
        lv_obj_set_style_local_image_recolor(BtnImg2, LV_IMG_PART_MAIN, LV_STATE_DEFAULT,
                                             LV_COLOR_BLACK);
        lv_obj_set_style_local_image_recolor_opa(BtnImg2, LV_IMG_PART_MAIN, LV_STATE_DEFAULT,
                                                 LV_OPA_COVER);
        UI_Set_User_Num(BtnImg2, 10);
        ListBtn = lv_obj_get_child_back(lv_obj_get_child(List->List.List, NULL), ListBtn);
    }
} /* UI_GroupList_Create */


/**
 * Create Interphone quit option UI
 * param (in) QuitOptDesc: UI_QuitOpt_Desc_t*
 * return  VOID
 */
VOID UI_Quit_Option_Create(VOID *QuitOptDesc)
{
    if (QuitOptDesc == NULL)
    {
        return;
    }

    UI_QuitOpt_Desc_t *OptDesc = (UI_QuitOpt_Desc_t *)QuitOptDesc;

    lv_obj_t *Win = UI_Normal_Win_Create(FALSE, NULL);
    lv_obj_set_style_local_bg_color(Win, LV_WIN_PART_BG, LV_STATE_DEFAULT, LV_COLOR_WHITE);
    lv_obj_set_style_local_bg_opa(Win, LV_WIN_PART_BG, LV_STATE_DEFAULT, LV_OPA_COVER);
    lv_obj_set_height(Win, FP_VER_RES - FP_STATUS_BAR_H);
    lv_obj_set_y(Win, FP_STATUS_BAR_H);

    lv_obj_t *Img = lv_img_create(Win, NULL);
    lv_img_set_src(Img, OptDesc->Img.Img);
    lv_obj_align(Img, Win, LV_ALIGN_IN_TOP_LEFT, FP_HOR_RES / 10, 4);

    UI_ObjAlign_Info_t AlignInfo;
    memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t));

    AlignInfo.Align       = LV_ALIGN_OUT_RIGHT_MID;
    AlignInfo.RefObj      = Img;
    AlignInfo.x           = 10;
    OptDesc->Label1.Label = UI_Normal_Label_Create(Win, &(OptDesc->Label1), 0, 0, &AlignInfo);
    lv_obj_set_style_local_text_color(OptDesc->Label1.Label, LV_LABEL_PART_MAIN,
                                      LV_STATE_DEFAULT, LV_COLOR_BLACK);
    lv_obj_set_style_local_text_letter_space(OptDesc->Label1.Label, LV_LABEL_PART_MAIN,
                                             LV_STATE_DEFAULT, 0);

    AlignInfo.Align       = LV_ALIGN_IN_LEFT_MID;
    AlignInfo.RefObj      = Win;
    AlignInfo.x           = FP_HOR_RES / 10;
    AlignInfo.y           = -4;
    OptDesc->Label2.Label = UI_Normal_Label_Create(Win, &(OptDesc->Label2), 0, 0, &AlignInfo);
    lv_obj_set_style_local_text_color(OptDesc->Label2.Label, LV_LABEL_PART_MAIN,
                                      LV_STATE_DEFAULT, LV_COLOR_BLACK);
    lv_obj_set_style_local_text_letter_space(OptDesc->Label2.Label, LV_LABEL_PART_MAIN,
                                             LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_pad_left(OptDesc->Label2.Label, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, 0);

    lv_obj_t *Btn1 = lv_btn_create(Win, NULL);
    lv_obj_set_style_local_pad_top(Btn1, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 2);
    lv_obj_set_style_local_pad_bottom(Btn1, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 2);
    lv_obj_set_style_local_pad_left(Btn1, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 4);
    lv_obj_set_style_local_pad_right(Btn1, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 4);
    lv_btn_set_fit(Btn1, TRUE);
    lv_obj_t *Label1 = lv_label_create(Btn1, NULL);
    lv_label_set_text_id(Label1, OptDesc->QuitBtn.TxtId);
    lv_obj_set_style_local_text_color(Label1, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT,
                                      LV_COLOR_MAKE(0x60,0xC0,0xFF));
    lv_obj_set_style_local_text_letter_space(Label1, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_bg_opa(Btn1, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_0);
    lv_obj_set_style_local_border_opa(Btn1, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_COVER);
    lv_obj_set_style_local_border_width(Btn1, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 1);
    lv_obj_set_style_local_border_color(Btn1, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
    lv_obj_set_style_local_border_width(Btn1, LV_BTN_PART_MAIN, LV_STATE_FOCUSED, 2);
    lv_obj_set_style_local_border_color(Btn1, LV_BTN_PART_MAIN, LV_STATE_FOCUSED,
                                        LV_COLOR_MAKE(0xFF, 0xCD, 0x77));
    lv_obj_set_event_cb(Btn1, OptDesc->QuitBtn.ReleaseFun);
    lv_obj_align(Btn1, Win, LV_ALIGN_IN_BOTTOM_LEFT, FP_HOR_RES / 10, -6);

    lv_obj_t *Btn2 = lv_btn_create(Win, Btn1);
    lv_obj_t *Label2 = lv_label_create(Btn2, Label1);
    lv_label_set_text_id(Label2, OptDesc->LogoutBtn.TxtId);
    lv_obj_set_event_cb(Btn2, OptDesc->LogoutBtn.ReleaseFun);
    lv_obj_align(Btn2, Win, LV_ALIGN_IN_BOTTOM_RIGHT, -FP_HOR_RES / 10, -6);

    OptDesc->QuitBtn.Button   = Btn1;
    OptDesc->LogoutBtn.Button = Btn2;

    UI_Normal_KeyFunc_Set(OptDesc->KeyFunc);
    UI_Normal_Group_Create(Btn1, Btn2, NULL);
} /* UI_Quit_Option_Create */


/**
 * Create Interphone poweroff UI
 * param (in) PoweroffDesc: UI_Normal_List_Only_Desc_t*
 * return  VOID
 */
VOID UI_PowerOff_Create(VOID *PoweroffDesc)
{
    if (PoweroffDesc == NULL)
    {
        return;
    }
    UI_Normal_List_Only_Create(PoweroffDesc);
    UI_Normal_List_Only_Desc_t *Poweropt = (UI_Normal_List_Only_Desc_t *)PoweroffDesc;
    lv_obj_set_y(Poweropt->List.List, FP_STATUS_BAR_H / 2);
    lv_btn_set_fit(Poweropt->List.ButtonList[0].Button, LV_FIT_NONE);
    lv_btn_set_fit(Poweropt->List.ButtonList[1].Button, LV_FIT_NONE);
    lv_obj_set_size(Poweropt->List.ButtonList[0].Button, FP_HOR_RES * 3 / 4,
        lv_obj_get_height(Poweropt->List.List) / 2);
    lv_obj_set_size(Poweropt->List.ButtonList[1].Button, FP_HOR_RES * 3 / 4,
        lv_obj_get_height(Poweropt->List.List) / 2);

    UI_Set_User_Ptr(Poweropt->List.ButtonList[0].Button, "poweroff");
    UI_Set_User_Ptr(Poweropt->List.ButtonList[1].Button, "restart");

    for (UINT8 i = 0; i < Poweropt->List.ListButtonCnt; i++)
    {
        lv_obj_set_style_local_bg_opa(Poweropt->List.ButtonList[i].Button,
                                      LV_BTN_PART_MAIN, LV_STATE_PRESSED, LV_OPA_50);
        lv_obj_set_style_local_border_width(Poweropt->List.ButtonList[i].Button,
                                            LV_BTN_PART_MAIN, LV_STATE_PRESSED, 1);
        lv_obj_set_style_local_border_color(Poweropt->List.ButtonList[i].Button, LV_BTN_PART_MAIN,
                                            LV_STATE_PRESSED, LV_COLOR_MAKE(0x60,0xC0,0xFF));
        lv_obj_set_style_local_border_side(Poweropt->List.ButtonList[i].Button, LV_BTN_PART_MAIN,
                                           LV_STATE_PRESSED, LV_BORDER_SIDE_FULL);
    }
}


/**
 * Reset Focus Obj Singnal Func
 * param (in) VOID
 * return  VOID
 */
VOID UI_Login_Reset_FocusFunc(VOID)
{
    FocusedObj_Signal_Func.Old_Signal_Func = Btn_signal_func;
}


/**
 * Operator List Action
 * param (in) ddlist: lv_obj_t*
 * return  lv_res_t
 */
VOID UI_OperatorList_Action(lv_obj_t * Ddlist, lv_event_t Event)
{
    if (Event != LV_EVENT_CLICKED)
    {
        return;
    }

    INT8     Str[32];
    lv_obj_t *ParCont      = lv_obj_get_child_back(lv_obj_get_parent(Ddlist),NULL);
    lv_obj_t *LabelTemp    = lv_obj_get_child_back(ParCont, NULL);
    lv_obj_t *OpratorLabel = lv_obj_get_child_back(ParCont, LabelTemp);

    lv_dropdown_get_selected_str(Ddlist, Str, 32);
    lv_label_set_text(OpratorLabel, Str);
    lv_dropdown_close(Ddlist);
    lv_group_focus_next(Group);
    lv_group_remove_obj(Ddlist);
    lv_obj_del(Ddlist);
    UI_Login_Reset_FocusFunc();
}


/**
 * Create OperatorList
 * param (in) Btn: lv_obj_t*
 * return  lv_obj_t*
 */
lv_obj_t *UI_OperatorList_Create(lv_obj_t *Btn)
{
    lv_obj_t *Par          = lv_obj_get_parent(lv_obj_get_parent(Btn));
    lv_obj_t *OperatorList = lv_dropdown_create(Par, NULL);

    lv_obj_set_size(OperatorList, FP_HOR_RES * 2 / 5, FP_VER_RES * 2 / 3);
    lv_obj_align(OperatorList, Btn, LV_ALIGN_OUT_BOTTOM_RIGHT, -20, 0);
    lv_dropdown_set_selected(OperatorList, 0);
    lv_dropdown_set_symbol(OperatorList, NULL);
    lv_obj_set_event_cb(OperatorList, UI_OperatorList_Action);

    lv_obj_set_style_local_bg_color(OperatorList, LV_DROPDOWN_PART_MAIN, LV_STATE_DEFAULT,
                                    LV_COLOR_WHITE);
    lv_obj_set_style_local_bg_grad_color(OperatorList, LV_DROPDOWN_PART_MAIN, LV_STATE_DEFAULT,
                                         LV_COLOR_WHITE);
    lv_obj_set_style_local_text_color(OperatorList, LV_DROPDOWN_PART_MAIN, LV_STATE_DEFAULT,
                                      LV_COLOR_BLACK);
    lv_obj_set_style_local_text_letter_space(OperatorList, LV_DROPDOWN_PART_MAIN, LV_STATE_DEFAULT,
                                             0);

    lv_obj_set_style_local_bg_color(OperatorList, LV_DROPDOWN_PART_SELECTED, LV_STATE_DEFAULT,
                                    LV_COLOR_MAKE(0x60,0xC0,0xFF));
    lv_obj_set_style_local_bg_grad_color(OperatorList, LV_DROPDOWN_PART_SELECTED, LV_STATE_DEFAULT,
                                         LV_COLOR_MAKE(0x60,0xC0,0xFF));
    lv_obj_set_style_local_text_color(OperatorList, LV_DROPDOWN_PART_SELECTED, LV_STATE_DEFAULT,
                                      LV_COLOR_BLACK);
    lv_obj_set_style_local_text_letter_space(OperatorList, LV_DROPDOWN_PART_SELECTED, LV_STATE_DEFAULT,
                                             0);

    lv_obj_set_style_local_bg_color(OperatorList, LV_DROPDOWN_PART_LIST, LV_STATE_DEFAULT,
                                    LV_COLOR_WHITE);
    lv_obj_set_style_local_bg_grad_color(OperatorList, LV_DROPDOWN_PART_LIST, LV_STATE_DEFAULT,
                                         LV_COLOR_WHITE);
    lv_obj_set_style_local_text_color(OperatorList, LV_DROPDOWN_PART_LIST, LV_STATE_DEFAULT,
                                      LV_COLOR_BLACK);
    lv_obj_set_style_local_text_letter_space(OperatorList, LV_DROPDOWN_PART_LIST, LV_STATE_DEFAULT,
                                             0);
    lv_obj_set_style_local_outline_width(OperatorList, LV_DROPDOWN_PART_LIST, LV_STATE_DEFAULT,
                                         2);
    lv_obj_set_style_local_outline_color(OperatorList, LV_DROPDOWN_PART_LIST, LV_STATE_DEFAULT,
                                         LV_COLOR_YELLOW);

    UI_Set_User_Num(OperatorList, 100);
    Btn_signal_func = FocusedObj_Signal_Func.Old_Signal_Func;
    lv_group_add_obj(Group, OperatorList);
    lv_group_focus_obj(OperatorList);
    return(OperatorList);
}


/**
 * Create Tip Msg Label ,Use Current Win as parent
 * param (in) MsgStr: INT8*
 * return  lv_obj_t *
 */
lv_obj_t *UI_TipMsg_Create(INT8 *MsgStr)
{
    lv_obj_t *Cont = lv_cont_create(UI_Normal_Get_Current_Win(), NULL);

    lv_cont_set_fit(Cont, LV_FIT_TIGHT);
    lv_obj_t *Label = lv_label_create(Cont, NULL);
    lv_label_set_text(Label, (const char *)MsgStr);
    lv_label_set_long_mode(Label, LV_LABEL_LONG_BREAK);
    lv_obj_set_width(Label, FP_HOR_RES * 3 / 4);
    lv_label_set_align(Label, LV_LABEL_ALIGN_CENTER);
    lv_obj_align(Cont, NULL, LV_ALIGN_CENTER, 0, 0);
    return(Cont);
}


/**
 * Create Volume Slider
 * param (in) Volume: UINT8
 * return  lv_obj_t *
 */
lv_obj_t *UI_Volume_Slider_Create(UINT8 Volume)
{
    lv_obj_t *Cont = lv_cont_create(FP_PARENT, NULL);
    lv_cont_set_fit2(Cont, FALSE, TRUE);
    lv_obj_set_width(Cont, FP_HOR_RES - 20);
    lv_obj_set_style_local_pad_top(Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 2);
    lv_obj_set_style_local_pad_bottom(Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 2);
    lv_obj_t *Img = lv_img_create(Cont, NULL);
    lv_img_set_src(Img, LV_SYMBOL_VOLUME_MID);
    lv_obj_add_style(Img, LV_IMG_PART_MAIN, &img_light);
    lv_obj_align(Img, NULL, LV_ALIGN_IN_LEFT_MID, 10, 0);
    lv_obj_t *Slider = lv_slider_create(Cont, NULL);
    lv_obj_set_size(Slider, FP_HOR_RES / 2, 5);
    lv_slider_set_range(Slider, 0, 10);
    lv_slider_set_value(Slider, Volume, LV_ANIM_OFF);
    lv_obj_align(Slider, Img, LV_ALIGN_OUT_RIGHT_MID, 15, 0);
    lv_obj_set_style_local_pad_left(Slider, LV_SLIDER_PART_BG, LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_pad_right(Slider, LV_SLIDER_PART_BG, LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_bg_color(Slider, LV_SLIDER_PART_BG, LV_STATE_DEFAULT, LV_COLOR_SILVER);
    lv_obj_set_style_local_radius(Slider, LV_SLIDER_PART_BG, LV_STATE_DEFAULT, 10);
    lv_obj_set_style_local_bg_color(Slider, LV_SLIDER_PART_INDIC, LV_STATE_DEFAULT,
                                    LV_COLOR_MAKE(0x60,0xC0,0xFF));
    lv_obj_set_style_local_bg_opa(Slider, LV_SLIDER_PART_INDIC, LV_STATE_DEFAULT, LV_OPA_COVER);
    lv_obj_set_style_local_radius(Slider, LV_SLIDER_PART_INDIC, LV_STATE_DEFAULT, 10);
    lv_obj_set_style_local_bg_color(Slider, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT,
                                    LV_COLOR_MAKE(0x60,0xC0,0xFF));
    lv_obj_set_style_local_radius(Slider, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);
    lv_obj_set_style_local_pad_top(Slider, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, 3);
    lv_obj_set_style_local_pad_bottom(Slider, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, 3);
    lv_obj_set_style_local_pad_left(Slider, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_pad_right(Slider, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_border_width(Slider, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, 1);
    lv_obj_align(Cont, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, -10);
    return(Cont);
}


/**
 * clean Btn selectedFunc
 * param (in)VOID
 * return  VOID
 */
VOID UI_Normal_Set_Btn_SeletedFunc_Clean(VOID)
{
    Btn_Sel_Func = NULL;
}

/*For Interphone demo end*/


/**
 * Destroy Current Window&Group
 * param (in) VOID
 * return  VOID
 */
VOID UI_Normal_Destroy(VOID)
{
    Ime_Destroy();
    if (UI_Normal_Current_Win != NULL)
    {
        lv_obj_del(UI_Normal_Current_Win);
        UI_Normal_Current_Win = NULL;
    }
    memset(&FocusedObj_Signal_Func, 0, sizeof(UI_Obj_Signal_Func_t));
    UI_Normal_KeyFunc_Set(NULL);
    BtnBar_Left  = NULL;
    BtnBar_Mid   = NULL;
    BtnBar_Right = NULL;
}


// for ui_common_ut
VOID UI_Normal_Destroy_LastWin(VOID)
{
    Ime_Destroy();
    if (UI_Normal_Last_Win != NULL)
    {
        lv_obj_del(UI_Normal_Last_Win);
        UI_Normal_Last_Win = NULL;
    }
    memset(&FocusedObj_Signal_Func, 0, sizeof(UI_Obj_Signal_Func_t));
    UI_Normal_KeyFunc_Set(NULL);
    BtnBar_Left  = NULL;
    BtnBar_Mid   = NULL;
    BtnBar_Right = NULL;
}


/**
 * Get Current Window
 * param (in) VOID
 * return  pointer to current win
 */
lv_obj_t *UI_Normal_Get_Current_Win(VOID)
{
    return(UI_Normal_Current_Win);
}

lv_group_t * UI_Normal_Get_Group(VOID)
{
    return Group;
}

/**
 * Get Current Focused Obj
 * param (in) VOID
 * return  pointer to current focused obj
 */
lv_obj_t *UI_Normal_Get_Current_FocusedObj(VOID)
{
    return(FocusedObj_Signal_Func.GroupObj);
}


/**
 * Get Text
 * param (in) TxtId defined in ui_textid.h
 * return  Corresponding En/Ch text based on lang_act
 */
const VOID *UI_Lang_Get_Text_ById(UINT16 TxtId)
{
#if LV_USE_MULTI_LANG
    if (UI_LANG_CH == lv_lang_act())/*0--En, 1--Ch*/
    {
        return(UI_Get_Chinese_Text(TxtId));
    }
    else
    {
        return(UI_Get_English_Text(TxtId));
    }
#else
    return(lv_lang_get_text(TxtId));
#endif
}


/**
 * UI wakes up with key
 * param (in) VOID
 * return VOID
 */
VOID UI_Wake_Up_With_Key(VOID)
{
    WakeupWithKey = TRUE;
}


/**
 * UI common init
 * param (in) VOID
 * return VOID
 */
VOID UI_Normal_Common_init(VOID)
{
    Simple_Theme = LV_THEME_SIMPLE_INIT();
    lv_theme_set_act(Simple_Theme);
#if LV_USE_MULTI_LANG
    lv_lang_set_text_func(UI_Lang_Get_Text_ById);
#endif
    UI_Normal_Init_KeyIndev();
    Group = lv_group_create();
    lv_group_set_focus_cb(Group, UI_Normal_Set_Focused_Obj);
    lv_group_set_wrap(Group,TRUE);
    lv_indev_set_group(KeyIndev, Group);
    WakeupWithKey = FALSE;
}

/**
 * Create 128*64 demo
 * param (in) Desc: UI_Demo_Desc_t*
 * return  VOID
 */
VOID UI_Demo_128x64_Create(UI_Demo_Desc_t *Desc)
{
    if (Desc == NULL)
    {
        return;
    }

    lv_obj_t *Cont = lv_cont_create(FP_PARENT, NULL);
    lv_obj_set_size(Cont, FP_HOR_RES, FP_VER_RES);
    lv_obj_set_pos(Cont, 0, 0);

    UI_ObjAlign_Info_t AlignInfo;
    memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t));

    AlignInfo.Align               = LV_ALIGN_IN_TOP_LEFT;
    Desc->SignalLabel.Label = UI_Normal_Label_Create(Cont, &(Desc->SignalLabel),
        FP_HOR_RES / 3, FP_VER_RES / 2,
        &AlignInfo);

    AlignInfo.Align                = LV_ALIGN_IN_TOP_MID;
    Desc->RatLabel.Label = UI_Normal_Label_Create(Cont, &(Desc->RatLabel),
        FP_HOR_RES / 3, FP_VER_RES / 2,
        &AlignInfo);

    AlignInfo.Align                = LV_ALIGN_IN_TOP_RIGHT;
    Desc->BatteryLabel.Label = UI_Normal_Label_Create(Cont, &(Desc->BatteryLabel),
        FP_HOR_RES / 3, FP_VER_RES / 2,
        &AlignInfo);

    AlignInfo.Align               = LV_ALIGN_IN_BOTTOM_LEFT;
    Desc->DateLabel.Label = UI_Normal_Label_Create(Cont, &(Desc->DateLabel),
        FP_HOR_RES / 2, FP_VER_RES / 2,
        &AlignInfo);

    AlignInfo.Align               = LV_ALIGN_IN_BOTTOM_RIGHT;
    Desc->TimeLabel.Label = UI_Normal_Label_Create(Cont, &(Desc->TimeLabel),
        FP_HOR_RES / 2, FP_VER_RES / 2,
        &AlignInfo);
}

/**
 * Create FullScreen Img
 * param (in) FullScrnImgDesc: UI_FullScreen_Img_Desc_t*
 * return  VOID
 */
VOID UI_FullScreen_Img_Create(VOID *FullScrnImgDesc)
{
    if (FullScrnImgDesc == NULL)
    {
        return;
    }
    UI_FullScreen_Img_Desc_t *FullImgDesc = (UI_FullScreen_Img_Desc_t *)FullScrnImgDesc;

    lv_obj_t *Img = lv_img_create(FP_PARENT, NULL);
    lv_obj_set_size(Img, FP_HOR_RES, FP_VER_RES);
    lv_img_set_src(Img, FullImgDesc->ImgSrc);
    lv_obj_align(Img, FP_PARENT, LV_ALIGN_CENTER, 0, 0);

    UI_Normal_Current_Win_Set(Img);
}

lv_obj_t * UI_slider_create(lv_obj_t * par_obj,lv_coord_t ver_offset,UI_Bar_Desc_t VolSlider)
{
    lv_obj_t * content = lv_cont_create(par_obj, NULL);

    if(content == NULL) return NULL;
    lv_obj_add_style(content, LV_CONT_PART_MAIN, &lv_style_transp);
    lv_obj_set_size(content, 204, 44);
    lv_obj_align(content, par_obj, LV_ALIGN_IN_TOP_MID, 0, ver_offset);
    lv_cont_set_layout(content, LV_LAYOUT_OFF);
    lv_obj_set_click(content, false);

    lv_obj_t * slider = lv_slider_create(content, NULL);
    lv_obj_set_size(slider, 186, 10);
    lv_obj_align(slider, content, LV_ALIGN_CENTER, 0, 0);

    lv_slider_set_range(slider, 0, (int16_t)VolSlider.Range); /*refer to HAL_SPEAKER_GAIN */
    lv_slider_set_value(slider, VolSlider.Value, LV_ANIM_OFF);

    lv_obj_set_style_local_bg_color(slider, LV_SLIDER_PART_BG, LV_STATE_DEFAULT, LV_COLOR_MAKE(0xa0,0xa0,0xa0));
    lv_obj_set_style_local_bg_grad_color(slider, LV_SLIDER_PART_BG, LV_STATE_DEFAULT, LV_COLOR_SILVER);
    lv_obj_set_style_local_bg_opa(slider, LV_SLIDER_PART_BG, LV_STATE_DEFAULT, LV_OPA_30);
    lv_obj_set_style_local_border_color(slider, LV_SLIDER_PART_BG, LV_STATE_DEFAULT, LV_COLOR_MAKE(0x40, 0x40, 0x40));
    lv_obj_set_style_local_border_opa(slider, LV_SLIDER_PART_BG, LV_STATE_DEFAULT, LV_OPA_30);
    lv_obj_set_style_local_radius(slider, LV_SLIDER_PART_BG, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);
    lv_obj_set_style_local_line_color(slider, LV_SLIDER_PART_BG, LV_STATE_DEFAULT, LV_COLOR_MAKE(0x20, 0x20, 0x20));
    lv_obj_set_style_local_pad_left(slider, LV_SLIDER_PART_BG, LV_STATE_DEFAULT, 15);
    lv_obj_set_style_local_pad_right(slider, LV_SLIDER_PART_BG, LV_STATE_DEFAULT, 15);
    lv_obj_set_style_local_pad_top(slider, LV_SLIDER_PART_BG, LV_STATE_DEFAULT, 15);
    lv_obj_set_style_local_pad_bottom(slider, LV_SLIDER_PART_BG, LV_STATE_DEFAULT, 15);

    return slider;
}

/**
 * Creat UI_Audio_Player_Desc_t
 * param (in) AudioNoTitleLblsBarDesc: UI_Audio_Player_Desc_t*
 * return  VOID
 */
VOID UI_Audio_NoTitle_Labels_Bar_Create(VOID *AudioNoTitleLblsBarDesc)
{
    if (AudioNoTitleLblsBarDesc == NULL)
    {
        return;
    }
    UI_Audio_Player_Desc_t *NoTitleLblsBarDesc =
        (UI_Audio_Player_Desc_t *)AudioNoTitleLblsBarDesc;

    lv_obj_t *Win = UI_Normal_Win_Create(FALSE, NULL);
    lv_win_set_scrollbar_mode(Win,LV_SCROLLBAR_MODE_HIDE);
    NoTitleLblsBarDesc->Win = Win;

    UI_ObjAlign_Info_t AlignInfo;
    memset(&AlignInfo, 0, sizeof(UI_ObjAlign_Info_t));

    lv_obj_t *Cont = lv_cont_create(Win, NULL);
    lv_obj_set_size(Cont, FP_HOR_RES, FP_CONT_BAR_H - FP_TITLE_BAR_H);

    AlignInfo.x = 0;

    AlignInfo.Align                        = LV_ALIGN_IN_TOP_MID;
    AlignInfo.y                            = FP_TITLE_BAR_H / 2;
    NoTitleLblsBarDesc->TitleLabel.Label =
    UI_Normal_Label_Create(Cont, &(NoTitleLblsBarDesc->TitleLabel), 180, FP_CONT_BAR_H / 5,
                &AlignInfo);
    lv_label_set_long_mode(NoTitleLblsBarDesc->TitleLabel.Label,
                                LV_LABEL_LONG_SROLL);

    AlignInfo.y                            = FP_TITLE_BAR_H + FP_CONT_BAR_H / 25;

    NoTitleLblsBarDesc->TimeLabel.Label =
    UI_Normal_Label_Create(Cont, &(NoTitleLblsBarDesc->TimeLabel), 180, FP_CONT_BAR_H / 5,
                &AlignInfo);

    lv_obj_t * Img = lv_img_create(Win, NULL);
    lv_img_set_src(Img, IMG_NAV);
    lv_obj_align(Img, Cont, LV_ALIGN_IN_BOTTOM_MID, -3, 50);

    lv_obj_t *ProgressBar = lv_slider_create(Win, NULL);
    lv_obj_set_size(ProgressBar, FP_HOR_RES * 4 / 5,  FP_TITLE_BAR_H * 2 / 7);
    lv_obj_align(ProgressBar, Cont, LV_ALIGN_IN_BOTTOM_MID, 0, -110);
    lv_slider_set_range(ProgressBar, 1, NoTitleLblsBarDesc->ProgressSlider.Range);
    lv_slider_set_value(ProgressBar, NoTitleLblsBarDesc->ProgressSlider.Value,LV_ANIM_OFF);
    NoTitleLblsBarDesc->ProgressSlider.Bar = ProgressBar;

    UI_Normal_ButtonBar_Create(&(NoTitleLblsBarDesc->BtnBar), Win);
    UI_Normal_KeyFunc_Set(NoTitleLblsBarDesc->KeyFunc);
    UI_Normal_Group_Create(ProgressBar, NULL, NULL);
} /* UI_Normal_NoTitle_Labels_Bar_Create */


/**
 * Play animation for opening ap or refreshing
 * param (in) Img: lv_obj_t *
 * param (in) Src: const VOID *
 * param (in) Fp: lv_anim_fp_t
 * return  VOID
 */
VOID UI_Wlan_Play_Refreshing_Anim(lv_obj_t *Img, const VOID *Src, lv_anim_ready_cb_t Fp)
{
    lv_obj_t *Par = lv_obj_get_parent(Img);
    lv_obj_set_click(lv_obj_get_parent(Par), FALSE);
    lv_img_set_src(Img, Src);
    UI_Set_User_Num(Img, 2);
    printf("%s: img %p, src %p\n", __FUNCTION__, Img, Src);
    lv_img_set_src(Img, SYMBOL_REFRESH_2);
    UI_Set_User_Num(Img, 2);
    lv_anim_t Anim = {};
    lv_anim_init(&Anim);
    lv_anim_set_var(&Anim, Img);
    lv_anim_set_start_cb(&Anim, (lv_anim_ready_cb_t)Fp);
    lv_anim_set_repeat_count(&Anim, LV_ANIM_REPEAT_INFINITE);
    lv_anim_set_time(&Anim, 150);
    lv_anim_start(&Anim);
}


/**
 * Add the button on the page of wlan ui
 * param (in) Desc: UI_Wlan_Btn_Desc_t*
 * return  VOID
 */
VOID UI_Wlan_Add_Btn(UI_Wlan_Btn_Desc_t *Desc)
{
    BOOL Is_In_Anim = FALSE;
    lv_coord_t FontH = lv_font_get_line_height(LV_FONT_PTR_DRIODSANSFALLBACKFULL_SMALL);
    lv_obj_t *Btn = NULL;
    VOID *Ptr;
    if (Desc->Btn) {
        if((UI_WLAN_BTN_TYPE_OPENING == UI_Get_User_Num(Desc->Btn))
           || (UI_WLAN_BTN_TYPE_REFRESHING == UI_Get_User_Num(Desc->Btn))) {
            Is_In_Anim = TRUE;
        }
        Btn = Desc->Btn;
        Ptr = UI_Get_User_Ptr(Btn);
        if (Ptr)
        {
            Hal_Mem_Free(Ptr);
        }
    }
    else
    {
        Btn = lv_btn_create(Desc->Par, NULL);
        lv_theme_apply(Btn, LV_THEME_LIST_BTN);
        if((UI_WLAN_BTN_TYPE_REFRESH == Desc->Type)
           || (UI_WLAN_BTN_TYPE_REFRESHING == Desc->Type)
           || (UI_WLAN_BTN_TYPE_SCAN_LIST == Desc->Type))
        {
            lv_obj_set_size(Btn, lv_obj_get_width(Desc->Par) - 10,
                            FontH + lv_obj_get_style_pad_top(Btn, LV_BTN_PART_MAIN) +
                            lv_obj_get_style_pad_bottom(Btn, LV_BTN_PART_MAIN));
        }
        else
        {
            lv_obj_set_size(Btn, lv_obj_get_width(Desc->Par) - 10,
                            2 * FontH + lv_obj_get_style_pad_top(Btn, LV_BTN_PART_MAIN) +
                            lv_obj_get_style_pad_bottom(Btn, LV_BTN_PART_MAIN) +
                            lv_obj_get_style_pad_inner(Btn, LV_BTN_PART_MAIN));
        }
        lv_btn_set_layout(Btn, LV_LAYOUT_OFF);
        lv_page_glue_obj(Btn, TRUE);
    }
    lv_obj_set_event_cb(Btn, Desc->BtnFunc);
    UI_Set_User_Num(Btn, Desc->Type);
    if (Desc->Ap)
    {
        Ptr = Hal_Mem_Alloc(Desc->ApLen);
        Hal_Mem_Copy(Ptr, Desc->Ap, Desc->ApLen);
    }
    else
    {
        Ptr = NULL;
    }
    UI_Set_User_Ptr(Btn, Ptr);

    lv_obj_t *Label1;
    if (Desc->Btn) {
        Label1 = lv_obj_get_child_back(Btn, NULL);
        if ((UI_WLAN_BTN_TYPE_REFRESH != Desc->Type)
            && (UI_WLAN_BTN_TYPE_REFRESHING != Desc->Type))
        {
            lv_label_set_text(Label1, Desc->Ssid);
        }
    }
    else
    {
        Label1 = lv_label_create(Btn, NULL);
        lv_label_set_long_mode(Label1, LV_LABEL_LONG_SROLL);
        if ((UI_WLAN_BTN_TYPE_REFRESH == Desc->Type)
            || (UI_WLAN_BTN_TYPE_REFRESHING == Desc->Type))
        {
            lv_obj_set_width(Label1, lv_obj_get_width(Btn) - 16 - FontH);
            lv_label_set_text_id(Label1, PHONE_TEXT_ID_REFRESH_NETWORK);
            lv_obj_align(Label1, Btn, LV_ALIGN_IN_LEFT_MID, 5, 0);
        }
        else
        {
            lv_img_header_t Header1;
            lv_img_header_t Header2;
            lv_img_decoder_get_info(Desc->ImgSrc1, &Header1);
            lv_img_decoder_get_info(Desc->ImgSrc2, &Header2);
            lv_obj_set_width(Label1, lv_obj_get_width(Btn) - 14 - Header1.w - Header2.w);
            lv_label_set_text(Label1, Desc->Ssid);
            if (UI_WLAN_BTN_TYPE_SCAN_LIST == Desc->Type)
            {
                lv_obj_align(Label1, Btn, LV_ALIGN_IN_LEFT_MID, 5, 0);
            }
            else
            {
                lv_obj_align(Label1, Btn, LV_ALIGN_IN_TOP_LEFT, 5,
                             lv_obj_get_style_pad_top(Btn, LV_BTN_PART_MAIN));
            }
        }
    }

    lv_obj_t *Label2 = NULL;
    if ((UI_WLAN_BTN_TYPE_ACT == Desc->Type)
        || (UI_WLAN_BTN_TYPE_SAVED == Desc->Type)
        || (UI_WLAN_BTN_TYPE_OPENING == Desc->Type)
        || (UI_WLAN_BTN_TYPE_OPEN_FAIL == Desc->Type))
    {
        if (Desc->Btn)
        {
            Label2 = lv_obj_get_child_back(Btn, Label1);
        }
        else
        {
            Label2 = lv_label_create(Btn, Label1);
            lv_obj_set_style_local_text_color(Label2, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT,
                                              LV_COLOR_GRAY);
        }
        if(UI_WLAN_BTN_TYPE_OPENING == Desc->Type)
        {
            lv_label_set_text_id(Label2, PHONE_TEXT_ID_CONNECTION);
        }
        else if (UI_WLAN_BTN_TYPE_ACT == Desc->Type)
        {
            lv_label_set_text_id(Label2, PHONE_TEXT_ID_CONNECTED);
        }
        else if (UI_WLAN_BTN_TYPE_SAVED == Desc->Type)
        {
            lv_label_set_text_id(Label2, PHONE_TEXT_ID_SAVED);
        }
        else
        {
            lv_label_set_text_id(Label2, PHONE_TEXT_ID_CONNECT_FAILED);
        }
        if(NULL == Desc->Btn)
        {
            lv_obj_align(Label2, Label1, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0);
            //lv_obj_get_style_pad_inner(Btn, LV_BTN_PART_MAIN));
        }
    }

    if ((UI_WLAN_BTN_TYPE_REFRESH == Desc->Type)
        || (UI_WLAN_BTN_TYPE_REFRESHING == Desc->Type))
    {
        lv_obj_t * ImgCont = NULL;
        lv_obj_t * Img = NULL;
        if (Desc->Btn)
        {
            ImgCont = lv_obj_get_child(Btn, NULL);
            Img = lv_obj_get_child(ImgCont, NULL);
        }
        else
        {
            ImgCont = lv_cont_create(Btn, NULL);
            lv_obj_set_size(ImgCont, FontH + 2, FontH + 2);
            lv_obj_add_style(ImgCont, LV_CONT_PART_MAIN, &lv_style_pretty);
            lv_obj_set_style_local_bg_color(ImgCont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT,
                                            LV_COLOR_MAKE(0x6b, 0x9a, 0xc7));
            lv_obj_set_style_local_bg_grad_color(ImgCont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT,
                                                 LV_COLOR_MAKE(0x2b, 0x59, 0x8b));
            Img = lv_img_create(ImgCont, NULL);
        }
        if (UI_WLAN_BTN_TYPE_REFRESHING == Desc->Type)
        {
            if (FALSE == Is_In_Anim)
            {
                UI_Wlan_Play_Refreshing_Anim(Img, Desc->ImgSrc2, Desc->AnimFp);
            }
        }
        else
        {
            if (Is_In_Anim)
            {
                lv_anim_del(Img, NULL);
            }
            lv_img_set_src(Img, Desc->ImgSrc2);
            lv_obj_set_click(Btn, TRUE);
        }
        if (NULL == Desc->Btn)
        {
            lv_obj_align(Img, ImgCont, LV_ALIGN_CENTER, 0, 0);
            lv_obj_align(ImgCont, Btn, LV_ALIGN_IN_RIGHT_MID, -5, 0);
        }
        printf("%s: refresh img %p\n", __FUNCTION__, Img);
    }
    else
    {
        lv_obj_t * LockImg;
        lv_obj_t * SignalImg;
        if (Desc->Btn)
        {
            if (Label2)
            {
                LockImg = lv_obj_get_child_back(Btn, Label2);
            }
            else
            {
                LockImg = lv_obj_get_child_back(Btn, Label1);
            }
            SignalImg = lv_obj_get_child_back(Btn, LockImg);
        }
        else
        {
            LockImg = lv_img_create(Btn, NULL);
            lv_img_set_src(LockImg, Desc->ImgSrc1);
            if (Label2)
            {
                lv_obj_align(LockImg, Btn, LV_ALIGN_IN_LEFT_MID,
                             lv_obj_get_x(Label1) + lv_obj_get_width(Label1) + 2, 0);
            }
            else
            {
                lv_obj_align(LockImg, Label1, LV_ALIGN_OUT_RIGHT_MID, 2, 0);
            }
            SignalImg = lv_img_create(Btn, NULL);
        }
        if (UI_WLAN_BTN_TYPE_OPENING == Desc->Type)
        {
            if (FALSE == Is_In_Anim)
            {
                UI_Wlan_Play_Refreshing_Anim(SignalImg, Desc->ImgSrc2, Desc->AnimFp);
            }
        }
        else
        {
            if (Is_In_Anim)
            {
                lv_anim_del(SignalImg, NULL);
            }
            lv_img_set_src(SignalImg, Desc->ImgSrc2);
        }
        if (NULL == Desc->Btn)
        {
            lv_obj_align(SignalImg, LockImg, LV_ALIGN_OUT_RIGHT_MID, 2, 0);
        }
        if (Desc->IsSecurity)
        {
            lv_obj_set_hidden(LockImg, FALSE);
        }
        else
        {
            lv_obj_set_hidden(LockImg, TRUE);
        }
    }

    Desc->Btn = Btn;
}

/**
 * Creat Wlan
 * param (in) Param: VOID*
 * return  VOID
 */
VOID UI_Wlan_Create(VOID *Param)
{
    if (NULL == Param)
    {
        return;
    }

    UI_Wlan_Desc_t *Desc = (UI_Wlan_Desc_t *)Param;
    lv_obj_t *Win = UI_Normal_Win_Create(TRUE, &(Desc->TitleBar));

    Desc->List = lv_list_create(Win, NULL);
    lv_list_set_scrollbar_mode(Desc->List, LV_SCROLLBAR_MODE_AUTO);
    lv_coord_t TitleBarLabelY2 = lv_obj_get_y(Desc->TitleBar.Label)
        + lv_obj_get_height(Desc->TitleBar.Label);
    lv_obj_set_size(Desc->List,
                    lv_obj_get_width(Win),
                    lv_obj_get_height(Win) - TitleBarLabelY2 - 8 - FP_BUTTON_BAR_H);
    lv_page_set_scrollable_fit2(Desc->List, FALSE, TRUE);
    lv_list_set_layout(Desc->List, LV_LAYOUT_COLUMN_MID);
    lv_obj_align(Desc->List, Win, LV_ALIGN_IN_TOP_MID, 0, TitleBarLabelY2 + 4);
    UI_Normal_Group_Create(Desc->List, NULL, NULL);

    lv_obj_t *Btn = lv_btn_create(Desc->List, NULL);
    lv_obj_set_size(Btn, lv_obj_get_width(Desc->List) - 10,
                    lv_font_get_line_height(LV_FONT_PTR_DRIODSANSFALLBACKFULL_SMALL) +
                    lv_obj_get_style_pad_top(Btn, LV_BTN_PART_MAIN) +
                    lv_obj_get_style_pad_bottom(Btn, LV_BTN_PART_MAIN));
    lv_btn_set_layout(Btn, LV_LAYOUT_OFF);
    lv_theme_apply(Btn, LV_THEME_LIST_BTN);
    lv_obj_set_event_cb(Btn, Desc->Sw.BtnFunc);
    lv_page_glue_obj(Btn, TRUE);

    lv_obj_t *Label = lv_label_create(Btn, NULL);
    Desc->Sw.Sw = lv_switch_create(Btn, NULL);
    lv_obj_add_style(Desc->Sw.Sw, LV_SWITCH_PART_BG, &lv_style_plain);
    lv_obj_add_style(Desc->Sw.Sw, LV_SWITCH_PART_INDIC, &lv_style_plain);
    lv_obj_add_style(Desc->Sw.Sw, LV_SWITCH_PART_KNOB, &lv_style_plain);

    lv_obj_set_style_local_radius(Desc->Sw.Sw, LV_SWITCH_PART_BG, LV_STATE_DEFAULT,
                                  LV_RADIUS_CIRCLE);
    lv_obj_set_style_local_bg_color(Desc->Sw.Sw, LV_SWITCH_PART_BG, LV_STATE_DEFAULT,
                                    LV_COLOR_GRAY);
    lv_obj_set_style_local_bg_grad_color(Desc->Sw.Sw, LV_SWITCH_PART_BG, LV_STATE_DEFAULT,
                                         LV_COLOR_GRAY);
    lv_obj_set_style_local_pad_left(Desc->Sw.Sw, LV_SWITCH_PART_BG, LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_pad_right(Desc->Sw.Sw, LV_SWITCH_PART_BG, LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_pad_top(Desc->Sw.Sw, LV_SWITCH_PART_BG, LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_pad_bottom(Desc->Sw.Sw, LV_SWITCH_PART_BG, LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_shadow_width(Desc->Sw.Sw, LV_SWITCH_PART_BG, LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_border_opa(Desc->Sw.Sw, LV_SWITCH_PART_BG, LV_STATE_DEFAULT, LV_OPA_0);

    lv_obj_set_style_local_radius(Desc->Sw.Sw, LV_SWITCH_PART_INDIC, LV_STATE_DEFAULT,
                                  LV_RADIUS_CIRCLE);
    lv_obj_set_style_local_bg_color(Desc->Sw.Sw, LV_SWITCH_PART_INDIC, LV_STATE_DEFAULT,
                                    LV_COLOR_MAKE(0x0B,0x85,0xFF));
    lv_obj_set_style_local_bg_grad_color(Desc->Sw.Sw, LV_SWITCH_PART_INDIC, LV_STATE_DEFAULT,
                                         LV_COLOR_MAKE(0x0B,0x85,0xFF));
    lv_obj_set_style_local_pad_left(Desc->Sw.Sw, LV_SWITCH_PART_INDIC, LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_pad_right(Desc->Sw.Sw, LV_SWITCH_PART_INDIC, LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_pad_top(Desc->Sw.Sw, LV_SWITCH_PART_INDIC, LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_pad_bottom(Desc->Sw.Sw, LV_SWITCH_PART_INDIC, LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_shadow_width(Desc->Sw.Sw, LV_SWITCH_PART_INDIC, LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_border_opa(Desc->Sw.Sw, LV_SWITCH_PART_INDIC, LV_STATE_DEFAULT, LV_OPA_0);

    lv_obj_set_style_local_radius(Desc->Sw.Sw, LV_SWITCH_PART_KNOB, LV_STATE_DEFAULT,
                                  LV_RADIUS_CIRCLE);
    lv_obj_set_style_local_bg_color(Desc->Sw.Sw, LV_SWITCH_PART_KNOB, LV_STATE_DEFAULT,
                                    LV_COLOR_WHITE);
    lv_obj_set_style_local_bg_grad_color(Desc->Sw.Sw, LV_SWITCH_PART_KNOB, LV_STATE_DEFAULT,
                                         LV_COLOR_WHITE);
    lv_obj_set_style_local_shadow_width(Desc->Sw.Sw, LV_SWITCH_PART_KNOB, LV_STATE_DEFAULT, 0);
    lv_obj_set_style_local_border_opa(Desc->Sw.Sw, LV_SWITCH_PART_KNOB, LV_STATE_DEFAULT, LV_OPA_0);
    lv_obj_set_style_local_pad_left(Desc->Sw.Sw, LV_SWITCH_PART_KNOB, LV_STATE_DEFAULT, -3);
    lv_obj_set_style_local_pad_right(Desc->Sw.Sw, LV_SWITCH_PART_KNOB, LV_STATE_DEFAULT, -3);
    lv_obj_set_style_local_pad_top(Desc->Sw.Sw, LV_SWITCH_PART_KNOB, LV_STATE_DEFAULT, -3);
    lv_obj_set_style_local_pad_bottom(Desc->Sw.Sw, LV_SWITCH_PART_KNOB, LV_STATE_DEFAULT, -3);

    lv_obj_set_size(Desc->Sw.Sw, 36, 16);
    lv_obj_align(Desc->Sw.Sw, Btn, LV_ALIGN_IN_RIGHT_MID, -5, 0);
    lv_obj_set_click(Desc->Sw.Sw, FALSE);
    if (Desc->Sw.State)
    {
        lv_label_set_text_id(Label, PHONE_TEXT_ID_WLAN_ON);
        lv_switch_on(Desc->Sw.Sw, FALSE);
    }
    else
    {
        lv_label_set_text_id(Label, PHONE_TEXT_ID_WLAN_OFF);
        lv_switch_off(Desc->Sw.Sw, FALSE);
    }
    lv_obj_align(Label, Btn, LV_ALIGN_IN_LEFT_MID, 5, 0);

    UI_Normal_KeyFunc_Set(Desc->KeyFunc);
    UI_Normal_ButtonBar_Create(&(Desc->BtnBar), Win);
} /* UI_Wlan_Create */

/**
 * Common function to create ui with list structure
 * param (in) Param: VOID*
 * return  VOID
 */
VOID UI_Wlan_List_Create(VOID *Param)
{
    if (NULL == Param)
    {
        return;
    }

    UI_Wlan_List_Desc_t *Desc = (UI_Wlan_List_Desc_t *)Param;
    lv_obj_t *Win = UI_Normal_Win_Create(TRUE, &(Desc->TitleBar));
    lv_obj_t *Btn;
    lv_obj_t *Cont;
    lv_obj_t *Label;
    lv_obj_t *Ta;
    lv_obj_t *Sw;
    UINT8 i, j;

    lv_label_set_long_mode(Desc->TitleBar.Label, LV_LABEL_LONG_SROLL);

    Desc->List = lv_list_create(Win, NULL);
    lv_obj_set_size(Desc->List, FP_HOR_RES, FP_CONT_BAR_H);
    lv_obj_align(Desc->List, NULL, LV_ALIGN_IN_TOP_MID, 0, FP_TITLE_BAR_H);
    UI_Normal_Group_Create(Desc->List, NULL, NULL);

    for (i = 0;i < Desc->BtnCnt;i++)
    {
        Btn = lv_btn_create(Desc->List, NULL);
        lv_theme_apply(Btn, LV_THEME_LIST_BTN);
        lv_btn_set_fit2(Btn, FALSE, TRUE);
        lv_obj_set_width(Btn, lv_obj_get_width(Desc->List) - 16);
        Desc->BtnList[i].Btn = Btn;

        if (UI_BASE_OBJ_LABEL == Desc->BtnList[i].Choise)
        {
            lv_obj_set_style_local_pad_left(Btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 5);
            lv_obj_set_style_local_pad_right(Btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 5);
            lv_obj_set_style_local_pad_top(Btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 5);
            lv_obj_set_style_local_pad_bottom(Btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 5);

            Cont = lv_cont_create(Btn, NULL);
            lv_cont_set_fit2(Cont, FALSE, TRUE);
            lv_obj_set_style_local_bg_color(Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT,
                                            LV_COLOR_BLACK);
            lv_obj_set_style_local_bg_opa(Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_COVER);
            lv_obj_set_style_local_pad_left(Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 2);
            lv_obj_set_style_local_pad_right(Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 2);
            lv_obj_set_style_local_pad_top(Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 2);
            lv_obj_set_style_local_pad_bottom(Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 2);
            lv_obj_set_style_local_pad_inner(Cont, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 5);
            lv_cont_set_layout(Cont, LV_LAYOUT_COLUMN_LEFT);
            lv_obj_set_width(Cont, lv_obj_get_width(Btn) - 10);

            Label = lv_label_create(Cont, NULL);
        }
        else
        {
            Label = lv_label_create(Btn, NULL);
        }
        lv_label_set_long_mode(Label, LV_LABEL_LONG_BREAK);
        lv_label_set_align(Label, Desc->BtnList[i].Label.TxtAlign);
        if (UI_BASE_OBJ_LABEL == Desc->BtnList[i].Choise)
        {
            lv_obj_set_style_local_text_line_space(Label, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, 0);
            lv_obj_set_width(Label, lv_obj_get_width(Cont) - 4);
        }
        else
        {
            if (UI_BASE_OBJ_SW == Desc->BtnList[i].Choise)
            {
                lv_obj_set_style_local_text_letter_space(Label, LV_LABEL_PART_MAIN,
                                                         LV_STATE_DEFAULT, 1);
                lv_obj_set_width(Label, lv_obj_get_width(Btn) - 38);
                lv_btn_set_layout(Btn, LV_LAYOUT_OFF);
            }
            else
            {
                lv_obj_set_width(Label, lv_obj_get_width(Btn) - 10);
            }
            lv_obj_align(Label, Btn, LV_ALIGN_IN_TOP_LEFT, 5,
                         lv_obj_get_style_pad_top(Btn, LV_BTN_PART_MAIN));
        }
        if (LV_LANG_TXT_ID_NONE != Desc->BtnList[i].Label.TxtId)
        {
            lv_label_set_text_id(Label, Desc->BtnList[i].Label.TxtId);
        }
        Desc->BtnList[i].Label.Label = Label;

        if (UI_BASE_OBJ_LABEL == Desc->BtnList[i].Choise)
        {
            for (j = 1;j < Desc->BtnList[i].u.LabelNum;j++)
            {
                Label = lv_label_create(Cont, Label);
            }
        }
        else if (UI_BASE_OBJ_TA == Desc->BtnList[i].Choise)
        {
            Ta = lv_textarea_create(Btn, NULL);
            lv_textarea_set_scrollbar_mode(Ta, LV_SCROLLBAR_MODE_OFF);
            lv_textarea_set_one_line(Ta, TRUE);
            lv_textarea_set_cursor_hidden(Ta, Desc->BtnList[i].u.Ta.TaCursorHide);
            lv_obj_set_size(Ta, lv_obj_get_width(Btn) - 10, lv_obj_get_height(Label) + 8);
            if (Desc->BtnList[i].u.Ta.TaTxt)
            {
                lv_textarea_set_text(Ta, Desc->BtnList[i].u.Ta.TaTxt);
            }
            else
            {
                lv_textarea_set_text(Ta, "");
            }
            if (PHONE_TEXT_ID_PWD == Desc->BtnList[i].Label.TxtId)
            {
                lv_textarea_set_pwd_mode(Ta, TRUE);
            }
            lv_obj_align(Ta, Label, LV_ALIGN_OUT_BOTTOM_MID, 0, 2);
            Desc->BtnList[i].u.Ta.TextArea = Ta;
        }
        else if (UI_BASE_OBJ_SW == Desc->BtnList[i].Choise)
        {
            Sw = lv_switch_create(Btn, NULL);
            lv_obj_add_style(Sw, LV_SWITCH_PART_BG, &lv_style_plain);
            lv_obj_add_style(Sw, LV_SWITCH_PART_INDIC, &lv_style_plain);
            lv_obj_add_style(Sw, LV_SWITCH_PART_KNOB, &lv_style_plain);

            lv_obj_set_style_local_radius(Sw, LV_SWITCH_PART_BG, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);
            lv_obj_set_style_local_bg_color(Sw, LV_SWITCH_PART_BG, LV_STATE_DEFAULT, LV_COLOR_GRAY);
            lv_obj_set_style_local_bg_grad_color(Sw, LV_SWITCH_PART_BG, LV_STATE_DEFAULT,
                                                 LV_COLOR_GRAY);
            lv_obj_set_style_local_pad_left(Sw, LV_SWITCH_PART_BG, LV_STATE_DEFAULT, 0);
            lv_obj_set_style_local_pad_right(Sw, LV_SWITCH_PART_BG, LV_STATE_DEFAULT, 0);
            lv_obj_set_style_local_pad_top(Sw, LV_SWITCH_PART_BG, LV_STATE_DEFAULT, 0);
            lv_obj_set_style_local_pad_bottom(Sw, LV_SWITCH_PART_BG, LV_STATE_DEFAULT, 0);
            lv_obj_set_style_local_shadow_width(Sw, LV_SWITCH_PART_BG, LV_STATE_DEFAULT, 0);
            lv_obj_set_style_local_border_opa(Sw, LV_SWITCH_PART_BG, LV_STATE_DEFAULT, LV_OPA_0);

            lv_obj_set_style_local_radius(Sw, LV_SWITCH_PART_INDIC, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);
            lv_obj_set_style_local_bg_color(Sw, LV_SWITCH_PART_INDIC, LV_STATE_DEFAULT,
                                            LV_COLOR_MAKE(0x0B,0x85,0xFF));
            lv_obj_set_style_local_bg_grad_color(Sw, LV_SWITCH_PART_INDIC, LV_STATE_DEFAULT,
                                                 LV_COLOR_MAKE(0x0B,0x85,0xFF));
            lv_obj_set_style_local_pad_left(Sw, LV_SWITCH_PART_INDIC, LV_STATE_DEFAULT, 0);
            lv_obj_set_style_local_pad_right(Sw, LV_SWITCH_PART_INDIC, LV_STATE_DEFAULT, 0);
            lv_obj_set_style_local_pad_top(Sw, LV_SWITCH_PART_INDIC, LV_STATE_DEFAULT, 0);
            lv_obj_set_style_local_pad_bottom(Sw, LV_SWITCH_PART_INDIC, LV_STATE_DEFAULT, 0);
            lv_obj_set_style_local_shadow_width(Sw, LV_SWITCH_PART_INDIC, LV_STATE_DEFAULT, 0);
            lv_obj_set_style_local_border_opa(Sw, LV_SWITCH_PART_INDIC, LV_STATE_DEFAULT, LV_OPA_0);

            lv_obj_set_style_local_radius(Sw, LV_SWITCH_PART_KNOB, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);
            lv_obj_set_style_local_bg_color(Sw, LV_SWITCH_PART_KNOB, LV_STATE_DEFAULT, LV_COLOR_WHITE);
            lv_obj_set_style_local_bg_grad_color(Sw, LV_SWITCH_PART_KNOB, LV_STATE_DEFAULT,
                                                 LV_COLOR_WHITE);
            lv_obj_set_style_local_shadow_width(Sw, LV_SWITCH_PART_KNOB, LV_STATE_DEFAULT, 0);
            lv_obj_set_style_local_border_opa(Sw, LV_SWITCH_PART_KNOB, LV_STATE_DEFAULT, LV_OPA_0);
            lv_obj_set_style_local_pad_left(Sw, LV_SWITCH_PART_KNOB, LV_STATE_DEFAULT, -3);
            lv_obj_set_style_local_pad_right(Sw, LV_SWITCH_PART_KNOB, LV_STATE_DEFAULT, -3);
            lv_obj_set_style_local_pad_top(Sw, LV_SWITCH_PART_KNOB, LV_STATE_DEFAULT, -3);
            lv_obj_set_style_local_pad_bottom(Sw, LV_SWITCH_PART_KNOB, LV_STATE_DEFAULT, -3);
            lv_obj_set_size(Sw, 28, 14);
            if (Desc->BtnList[i].u.Sw.State)
            {
                lv_switch_on(Sw, FALSE);
            }
            else
            {
                lv_switch_off(Sw, FALSE);
            }
            lv_obj_align(Sw, Btn, LV_ALIGN_IN_RIGHT_MID, -6, 5);
            lv_obj_set_click(Sw, FALSE);
            Desc->BtnList[i].u.Sw.Sw = Sw;
        }
    }
    if (Desc->BtnCnt > Desc->Index)
    {
        lv_list_focus_btn(Desc->List, Desc->BtnList[Desc->Index].Btn);
    }
    UI_Normal_KeyFunc_Set(Desc->KeyFunc);
    UI_Normal_ButtonBar_Create(&(Desc->BtnBar), Win);
}


/**
 * Creat Interphone_Test
 * param (in) Desc: UI_Normal_Container_List_Desc_t *
 * return  VOID
 */
VOID UI_Interphone_Test_Create(VOID *Param)
{
    if (Param == NULL) return;

    UINT8                           i;
    UI_Container_Base_Desc_t        *BtnDesc;
    lv_coord_t                      ListH = FP_WIN_H;
    lv_coord_t                      ListY = 2;
    lv_obj_t                        *Btn  = NULL;
    UI_Normal_Container_List_Desc_t *Desc = (UI_Normal_Container_List_Desc_t *)Param;

    lv_obj_t *Win = UI_Normal_Win_Create(FALSE, NULL);

    if ((LV_LANG_TXT_ID_NONE != Desc->TitleBar.TxtId) || Desc->TitleBar.ImgSrc)
    {
        Desc->TitleBar.Label = lv_label_create(Win, NULL);
        lv_obj_set_style_local_text_letter_space(Desc->TitleBar.Label, LV_LABEL_PART_MAIN,
                                                 LV_STATE_DEFAULT, 0);
        lv_obj_set_style_local_text_color(Desc->TitleBar.Label, LV_LABEL_PART_MAIN,
                                          LV_STATE_DEFAULT, LV_COLOR_MAKE(0x60,0xC0,0xFF));
        if (LV_LANG_TXT_ID_NONE != Desc->TitleBar.TxtId)
        {
            lv_label_set_text_id(Desc->TitleBar.Label, Desc->TitleBar.TxtId);
        }
        else
        {
            lv_label_set_text(Desc->TitleBar.Label, Desc->TitleBar.ImgSrc);
        }
        lv_obj_align(Desc->TitleBar.Label, Win, LV_ALIGN_IN_TOP_MID, 0, 2);
        ListY += lv_obj_get_y(Desc->TitleBar.Label) + lv_obj_get_height(Desc->TitleBar.Label);
        ListH -= ListY;
    }

    if (Desc->ButtonBar.ButtonL.Valid || Desc->ButtonBar.ButtonR.Valid)
    {
        lv_coord_t BtnW = FP_HOR_RES / 3 + 10;
        if (Desc->ButtonBar.ButtonL.Valid)
        {
            Btn = lv_btn_create(Win, NULL);
            lv_btn_set_fit2(Btn, FALSE, TRUE);
            lv_obj_set_style_local_pad_left(Btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 2);
            lv_obj_set_style_local_pad_right(Btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 0);
            lv_obj_set_style_local_pad_top(Btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 2);
            lv_obj_set_style_local_pad_bottom(Btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 2);
            lv_obj_set_width(Btn, BtnW);
            lv_btn_set_layout(Btn, LV_LAYOUT_COLUMN_LEFT);

            lv_obj_t *Label = lv_label_create(Btn, NULL);
            lv_obj_set_style_local_text_letter_space(Label, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, 0);
            lv_label_set_text_id(Label, Desc->ButtonBar.ButtonL.TxtId);

            lv_obj_align(Btn, Win, LV_ALIGN_IN_BOTTOM_LEFT, 5, -4);
            Desc->ButtonBar.ButtonL.Button = Btn;
            BtnBar_Left = Btn;
        }

        if (Desc->ButtonBar.ButtonR.Valid)
        {
            Btn = lv_btn_create(Win, NULL);
            lv_btn_set_fit2(Btn, FALSE, TRUE);
            lv_obj_set_style_local_pad_left(Btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 0);
            lv_obj_set_style_local_pad_right(Btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 2);
            lv_obj_set_style_local_pad_top(Btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 2);
            lv_obj_set_style_local_pad_bottom(Btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 2);
            lv_obj_set_width(Btn, BtnW);
            lv_btn_set_layout(Btn, LV_LAYOUT_COLUMN_RIGHT);

            lv_obj_t *Label = lv_label_create(Btn, NULL);
            lv_obj_set_style_local_text_letter_space(Label, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, 0);
            lv_label_set_text_id(Label, Desc->ButtonBar.ButtonR.TxtId);

            lv_obj_align(Btn, Win, LV_ALIGN_IN_BOTTOM_RIGHT, -5, -4);
            Desc->ButtonBar.ButtonR.Button = Btn;
            BtnBar_Right = Btn;
        }

        ListH -= lv_obj_get_height(Btn) + 4;
    }

    lv_obj_t *List = lv_list_create(Win, NULL);
    Desc->List = List;
    lv_list_set_scrollbar_mode(List, LV_SCROLLBAR_MODE_AUTO);
    lv_obj_set_style_local_bg_opa(List, LV_LIST_PART_SCROLLBAR, LV_STATE_DEFAULT, LV_OPA_COVER);
    lv_obj_set_style_local_bg_color(List, LV_LIST_PART_SCROLLBAR, LV_STATE_DEFAULT, LV_COLOR_GRAY);
    lv_obj_set_style_local_pad_left(List, LV_LIST_PART_SCROLLBAR, LV_STATE_DEFAULT, 1);
    lv_obj_set_style_local_pad_right(List, LV_LIST_PART_SCROLLBAR, LV_STATE_DEFAULT, 1);
    lv_obj_set_size(List, FP_HOR_RES, ListH);
    lv_obj_align(List, Win, LV_ALIGN_IN_TOP_MID, 0, ListY);

    for (i = 0; i < Desc->ContList.ListContainerCnt; i++)
    {
        if (UI_BASE_OBJ_LABEL != Desc->ContList.ContainerList[i].Choise)
        {
            break;
        }
    }
    BOOL IsLabelOnly = FALSE;
    if (Desc->ContList.ListContainerCnt == i)
    {
        lv_obj_set_style_local_pad_inner(List, LV_LIST_PART_BG, LV_STATE_DEFAULT, 1);
        IsLabelOnly = TRUE;
    }
    for (i = 0; i < Desc->ContList.ListContainerCnt; i++)
    {
        Btn = NULL;
        BtnDesc = &Desc->ContList.ContainerList[i];
        if (LV_LANG_TXT_ID_NONE != BtnDesc->Label.TxtId)
        {
            Btn = lv_list_add_btn(List, NULL, lv_lang_get_text(BtnDesc->Label.TxtId));
        }
        else if (BtnDesc->Label.ImgSrc)
        {
            Btn = lv_list_add_btn(List, NULL, BtnDesc->Label.ImgSrc);
        }
        else
        {
            Btn = lv_list_add_btn(List, NULL, " ");
        }
        if (IsLabelOnly)
        {
            lv_obj_set_style_local_pad_top(Btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 1);
            lv_obj_set_style_local_pad_bottom(Btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 1);
        }
        lv_obj_t *Label = lv_obj_get_child_back(Btn, NULL);
        BtnDesc->Label.Label = Label;
        lv_obj_set_style_local_text_letter_space(Label, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, 0);
        lv_btn_set_layout(Btn, LV_LAYOUT_COLUMN_LEFT);
        if (UI_BASE_OBJ_TA == BtnDesc->Choise)
        {
            IsLabelOnly = FALSE;

            lv_obj_t *Ta = lv_textarea_create(Btn, NULL);
            BtnDesc->u.Ta.TextArea = Ta;
            lv_obj_set_width(Ta, lv_obj_get_width(Btn) - 2 * lv_obj_get_x(Label));
            lv_obj_set_style_local_text_letter_space(Ta, LV_TEXTAREA_PART_BG, LV_STATE_DEFAULT, 0);
            lv_textarea_set_one_line(Ta, TRUE);
            if (BtnDesc->u.Ta.TaTxt)
            {
                lv_textarea_set_text(Ta, BtnDesc->u.Ta.TaTxt);
            }
            else
            {
                lv_textarea_set_text(Ta, "");
            }
        }
        lv_obj_set_event_cb(Btn, BtnDesc->ReleaseFunc);
        BtnDesc->Button = Btn;
    }
    if (Desc->ContList.Index < Desc->ContList.ListContainerCnt)
    {
        lv_list_focus_btn(List, Desc->ContList.ContainerList[Desc->ContList.Index].Button);
    }

    FocusedObj_Signal_Func.GroupType = UI_GROUP_TYPE_NONE;
    UI_Normal_Group_Create(Win, NULL, NULL);
    UI_Normal_KeyFunc_Set(Desc->KeyFunc);
}
